2015-12-02 70 views
0

我使自己成爲一個插件用於加載與beforeFind()相關的內容,所以你可以說ContentPage/10類似於ConentNews/10Gallery/5CakePHP 3.1,通用屬於許多

我的表related_contents樣子:

id     int(11) 
source_table_name varchar(255) 
target_table_name varchar(255) 
source_table_id  int(11) 
target_table_id  int(11) 

我的行爲的代碼:

public function beforeFind(Event $event, Query $query, ArrayObject $options, $primary) { 
    $attachedTables = self::getAttachedTables(); //Array of ORM models which has this behavior 
    foreach ($attachedTables as $attachedTable) { 
    $options = [ 
     'through' => 'RelatedContents', 
     'bindingKey' => 'RelatedContents.source_table_id', 
     'foreignKey' => 'RelatedContents.target_table_id', 
     'conditions' => [ 
     'RelatedContents.source_table_name' => $this->_table->table(), 
     'target_table_name' => $attachedTable->table(), 
     ] 
    ]; 
    $this->_table->belongsToMany($attachedTable->alias(), $options); 
    } 
} 

現在,當我在我的模型試圖find(),零個相關的實體,沒有發現錯誤。我究竟做錯了什麼?

+0

我不認爲'beforeFilter'是放置代碼的正確位置。試試'initialize'而不是 – arilia

+0

我試過了,它會因getAttachedTables()方法觸發遞歸。但我不認爲它應該有所作爲,我試圖把hasMany放在查找之前,它的工作原理。 – Aiphee

回答

2

如果在初始化時間調用您的getAttachedTables()方法會導致遞歸,那麼可能需要修正某些問題。重新關聯每個發現似乎不是一個非常好的主意,除非您確實需要這樣做,因爲關聯已更改/需要更改或已被刪除。

這就是說,您的問題最有可能是缺少targetForeignKey選項,您正在使用的bindingKey選項不可用於BelongsToMany關聯!還要注意,外鍵需要定義而不使用別名!

此外,您還在條件中缺少別名,但這與應用程序無關聯的問題無關。

所以,foreignKey應設置爲當前模型的FK列,targetForeignKey目標模型的FK列,例如

$options = [ 
    // ... 
    'foreignKey'  => 'source_table_id', 
    'targetForeignKey' => 'target_table_id', 
    // ... 
]; 

參見

+0

你是金,謝謝。我一直在改變代碼和閱讀文檔,但我讀得很糟糕。如果關聯在beforeFind中添加了初始化,真的有什麼區別嗎? – Aiphee

+1

@Aiphee區別在於,這是在'beforeFind'中完成的,每個查找調用都會再次設置關聯,而對於每個表類實例,只有一次'initialize'應該只發生一次。 – ndm

+0

所以,當我只是顯示索引頁面時,應該沒有太大的區別,但它可能會對鏈接搜索或子查詢有所幫助? – Aiphee