2014-02-27 28 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

这两个工作。如果你只想得到学生,你必须在你的查找方法中添加条件,因为这种关系适用于所有模型。 –

相关问题