2017-05-07 73 views
0

如果我寫了下面的查詢:CakePHP3:無法獲取匹配的正常工作

$sites = $this->Sites->find() 
->contain(['Agthemes']) 
->matching('Agthemes', function ($q) { 
    return $q->where([ 
     'Agthemes.site_id IS NOT' => null 
    ]); 
}) 
->all(); 

我只得到Sites已經存在Agthemes

現在我寫一個類似的查詢,但有一個附加的關聯級別:

$users = $this->Users->find('all') 
->contain([ 
    'Sites.Agthemes' 
]) 
->matching('Sites.Agthemes', function ($q) { 
    return $q->where([ 
     'Agthemes.site_id IS NOT' => null 
    ]); 
}) 
->distinct(['Users.id']) 
->limit(5) 
->all(); 

而且在這種情況下,我也得到SitesAgthemes。 你能告訴我爲什麼嗎?

編輯

我想補充的關係

SitesTable

$this->hasMany('Agthemes', [ 
     'dependent' => true, 
     'cascadeCallbacks' => true, 
    ]); 

    $this->belongsToMany('Users', [ 
     'joinTable' => 'sites_users', 
    ]); 

UsersTable

$this->belongsToMany('Sites', [ 
     'targetForeignKey' => 'site_id', 
     'joinTable' => 'sites_users', 
    ]); 

AgthemesTable

$this->belongsTo('Sites'); 

回答

0

在DebugKit中,查看正在運行的查詢。使用'contains'通常運行完全獨立的查詢,然後結合結果(取決於關聯類型)。

如果您想確保根據相關模型的條件限制結果,請使用'連接'而不是'包含'。

看到這個頁面,詳細瞭解該協會如何使用(或不使用)連接,以及如何更改連接策略......等等:

https://book.cakephp.org/3.0/en/orm/associations.html

+0

這裏我的問題是,我無法顯示DebugKit工具欄。看起來Debugkit工作正常,因爲如果我更改文件夾名稱,就會出現錯誤。我正在研究一個子域(test.myweb.com),我看到很多關於這個問題的文章,我想我檢查了一切,在日誌和螢火蟲中看不到任何錯誤!?! – 2ndGAB

+0

我不確定在不同版本之間的事情是,如果我們必須編寫'public $ components = ['DebugKit.Toolbar'];'如你所說[這裏](http://stackoverflow.com/questions/15124398/how-to-install-debugkit-on-cakephp),但我認爲這是cakePHP2相關的,我沒有看到這樣的事情[這裏](https://github.com/cakephp/app/blob/master/src/Controller /AppController.php) – 2ndGAB

+0

沒有得到DebugKit的工作肯定是一個問題,但應該是它自己的問題,包括所有的細節。 – Dave