2014-02-27 65 views
0

我只是因爲find()結果而感到困惑。這是我的配置:使用Model :: find()時的關聯CakePHP條件子句

首先,用戶可以有不同的User.role值:studentadmin和其他一些。

// Book 
public $belongsTo = array(
    'Student' => array(
     'className' => 'User', 
     'foreignKey' => 'student_id' 
     'conditions' => array('User.role' => 'student') 
    ); 
); 

當我鏈模式一樣$this->Book->Student->find('list');我期待得到的只有用戶,其作用是'student',而是,它得到所有用戶。這裏發生了什麼,關於關聯定義的conditions是什麼,在哪裏可以使用和不能使用。任何領導都會有所幫助,謝謝。

PS:我知道,我可以把條件對find(),這不是你有小姐,你的模型裏面的問題

回答

0

有關聯的數據之間的差異訪問關聯的模型對象。如果您訪問$ this-> Book-> Student,則您正在訪問Student模型並在其範圍內工作。定義的關聯中的條件僅在訪問的對象的上下文中起作用。

所以,如果你在書查找並列出學生這本書:

$this->Book->find('first', array('contain' => array('Student')); 

您的代碼將正常工作。它會找到這本書加上第一個具有stundent角色的用戶。 但是你的關聯是錯誤的:那應該是hasMany。因爲如果這本書只屬於一個學生,你爲什麼要按照角色過濾一本書?

如果你想通過他們的角色過濾用戶,你可以實現在beforeFind(),僞代碼中檢查的查詢參數:if isset roleFilter然後添加爭用從roleFilter角色過濾該角色。

或者,如果您不需要分頁,只需在用戶模型中創建一個getStudents()方法,該方法將返回一個包含條件的find('list')。

Student extends User並將過濾器放在beforeFind()中,並在您的Book關聯中使用該模型而不是User模型。

如果你想過濾模型級別或每個模型,我認爲最後一個是一個不錯的選擇。不要忘記設置$useTable$name或者繼承的模型會導致問題。

0


試試這個:

public $belongsTo = array(
    'Student' => array(
     'className' => 'User', 
     'foreignKey' => 'student_id', //<------ miss 
     'conditions' => array('User.role' => 'student') 
    ); 
); 

Yoi可以調試您的查詢檢查什麼是你做真正的查詢。
就我個人而言,我從來沒有使用過這種方法,我更喜歡用另外一個表的外鍵,例如RolesUser.role_id
對我來說,使用這種方法更適合在您的應用程序內部提供更多的靈活性。
之後,我更願意使用內部控制器檢查查詢的條件,因爲在您的方式中,您搜索的每個查詢總是針對學生角色而不是另一個,並且可能成爲其餘角色的問題,因爲您看到的內部控制器一個沒有條件的發現,但它沒有取得正確的價值,因爲在你的模型中有一個特定的條件。

對我來說,最好的方法是創建一個新表,使用外鍵和控制器內部的條件來查看你在做什麼。

+0

對不起,我在我的帖子上發了一個錯字,代碼很好。現在我研究了一下,難道是模型鏈(即$ this-> Book-> Student-> find()')與$ this-> Book-> find()包含Student不一樣嗎?也許我有模型鏈接錯誤的想法 –

+0

是是一樣的,但我建議你把控制器中的哪裏條件不在模型中@ChristopherFrancisco –

0

對於默認所有的關係都是「左加入」,則必須設置參數「」與「」值

// Book 
public $belongsTo = array(
    'Student' => array(
     'className' => 'User', 
     'foreignKey' => 'student_id' 
     'conditions' => array('Student.role' => 'student'), // <-- Fix That (field name) 
     'type' => 'inner', // <-- add that 
    ); 
); 
+0

似乎也不工作。這些關係在模型鏈接時還是隻爲自己工作?也許這就是問題所在,因爲SQL日誌不會說LEFT JOIN和INNER JOIN。 –

+0

這兩個工作。如果你只想得到學生,你必須在你的查找方法中添加條件,因爲這種關係適用於所有模型。 –

相關問題