2017-06-17 47 views
0

不知何故,下面的代碼不起作用 - 它打印所有的subforums,而不是隻打印一個subforum和它的線程。CakePHP Containable哪裏不行

代碼:

(控制器類):

public function view($id) 
    { 
     $subforums = TableRegistry::get('subforums'); 
     $query = $subforums->find('all'); 
     $query 
     ->contain('threads', function ($q) { 
     return $q->where(['threads.sub_forum_id' => 1]); 
     }); 
     $this->set('query', $query); 
    } 

(表)

public function initialize(array $config) 
    { 
     $this->hasMany('threads'); 
    } 

表結構:

CREATE TABLE `sub_forums` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    `desc` text, 
    `forum_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `threads` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    `body` text, 
    `sub_forum_id` int(11) DEFAULT NULL, 
    `last_post_date` varchar(255) DEFAULT NULL, 
    `starter` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

由於

+0

提供你的表結構以及 –

回答

1

目前還沒有這樣的contain()簽名,它只會在CakePHP 3.5.0中引入,因此第二個參數預計是一個布爾值,並且將被忽略,因此條件不會被應用。

的正確的方法是通過一個陣列中的形式:

['AssociationName' => function() {}] 

但是,即使將被應用的條件,就不能過濾hasMany協會這樣一來,因爲它們是在一個單獨的被檢索查詢。相反,只需在父級(主要查詢)上應用條件,就不需要任何花哨的過濾。

$query = $subforums 
    ->find() 
    ->where(['id' => 1]) 
    ->contain(['threads']); 

或者使用get()通過其主鍵直接檢索單個實體:

$subforum = $subforums->get(1, [ 
    'contain' => ['threads'] 
]); 

ps的,按照約定的別名應該是駱駝capsed,即SubForumsThreads

又見

+0

謝謝,作品! :) – Anoniem