2015-11-30 5 views
0

Я использую построитель запросов, предоставленный CakePHP 3, для извлечения «предложений» из базы данных с записями из другой таблицы с использованием ['contain' => 'AnotherTable'], но извлекается только одна из таблиц, помещенных в массив contain, как могу ли я сделать две записи таблицы будут восстановлены?CakePHP3 «содержать» не извлекает данные

запрос с двумя таблицами (только 'OfferBanners' был retrived):

$setting = [ 
      'fields' => ['id', 'product_id', 'date_start', 'date_end', 'name', 'description'], 
      'contain' => ['Products', 'OfferBanners'] 
     ]; 
$offers = TableRegistry::get('Offers') 
     ->find('all', $setting)->hydrate(false)->toArray(); 

Результат массива:

Link to array pastebin

Initialize из OffersTable:

public function initialize(array $config) 
{ 
    parent::initialize($config); 

    $this->table('offers'); 
    $this->displayField('id'); 
    $this->primaryKey('id'); 
    $this->addBehavior('Timestamp'); 
    $this->belongsTo('Products', [ 
     'foreignKey' => 'product_id', 
     'joinType' => 'INNER' 
    ]); 
    $this->hasMany('OfferBanners', [ 
     'foreignKey' => 'offer_id' 
    ]); 
} 

Initialize из ProductsTable:

public function initialize(array $config) 
{ 
    $this->table('products'); 
    $this->displayField('id'); 
    $this->primaryKey('id'); 
    $this->addBehavior('Timestamp'); 
    $this->belongsTo('Stores', [ 
     'foreignKey' => 'store_id', 
     'joinType' => 'INNER' 
    ]); 
    $this->hasMany('Bookings', [ 
     'foreignKey' => 'product_id' 
    ]); 
    $this->hasMany('ProductFeatures', [ 
     'foreignKey' => 'product_id' 
    ]); 
    $this->hasMany('Offers', [ 
     'foreignKey' => 'product_id' 
    ]); 
} 

SQL из таблиц:

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    product_name VARCHAR(255) NOT NULL, 
    store_id INT NOT NULL, 
    sub_category_id INT NOT NULL, 
    price DECIMAL(7,2) NOT NULL, 
    created DATETIME, 
    modified DATETIME, 
    FOREIGN KEY store_key (store_id) REFERENCES stores(id), 
    FOREIGN KEY sub_category_key (sub_category_id) REFERENCES sub_categories(id) 
); 

CREATE TABLE offers (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    product_id INT NOT NULL, 
    name VARCHAR(255) NOT NULL, 
    description VARCHAR(1000) NOT NULL, 
    date_start DATETIME NOT NULL, 
    date_end DATETIME NOT NULL, 
    created DATETIME, 
    modified DATETIME, 
    FOREIGN KEY product_key (product_id) REFERENCES products(id) 
); 

CREATE TABLE offer_banners (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    path VARCHAR(255) NOT NULL, 
    offer_id INT NOT NULL, 
    created DATETIME, 
    modified DATETIME, 
    FOREIGN KEY offer_key (offer_id) REFERENCES offers(id) 
); 
+0

вы не выбрали поле из соответствующих моделей – arilia

+0

@arilia Но в "OfferBanners" является retrived все поля – Ricardo

+0

@arilia ничего не пишет по ошибке.log – Ricardo

ответ

1

попробовать

$offers = TableRegistry::get('Offers'); 

$offers = $offers->find() 
    ->select(['id', 'product_id', 'date_start', 'date_end', 'name', 'description']) 
    ->select($offers->Products) 
    ->select($offers->OfferBanners) 
    ->contain(['Products', 'OfferBanners'])->hydrate(false)->toArray(); 

редактировать: Или, если вы используете торт < 3,1

$offers = TableRegistry::get('Offers'); 

$offers = $offers->find() 
    ->select(['id', 'product_id', 'date_start', 'date_end', 'name', 'description']) 
    ->select(['Products.id']) // list your Products field list here 
    ->select(['OfferBanners.id']) // list your OfferBanners field list here 
    ->contain(['Products', 'OfferBanners'])->hydrate(false)->toArray(); 

или

$offers = $offers->find() 
    ->select(['id', 'product_id', 'date_start', 'date_end', 'name', 'description']) 
    ->contain([ 
     'Products' => function($q) { 
      return $q->autoFields(true); 
     }, 
     'OfferBanners' => function($q) { 
      return $q->autoFields(true); 
     } 
    ])->hydrate(false)->toArray(); 

, если вы хотите, чтобы выбрать конкретные области использования т.е.

'OfferBanners' => function($q) { 
      return $q->select([/* insert field list here */]); 
     } 
+0

Не работает, запрашивает эту ошибку: Обманутая фатальная ошибка: объект класса Cake \ ORM \ Association \ BelongsTo не может быть преобразован в строку в C: \ xampp \ htdocs \ PROJETOS \ Shopping \ vendor \ cakephp \ cakephp \ src \ База данных \ QueryCompiler.php в строке 175 – Ricardo

+0

Возможно, вы используете торт <3.1. Если так, то я отредактирую свой вопрос – arilia

+0

Я использую cakephp 3.0 – Ricardo

Смежные вопросы