使用Model :: find()时关联的CakePHP条件子句

时间:2014-02-27 19:58:38

标签: cakephp

我因为find()结果而感到困惑。这是我的配置:

首先,用户可以拥有不同的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()上设置条件,这不是问题

3 个答案:

答案 0 :(得分:0)

你错过了,在你的模特里面 试试这个:

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

Yoi可以调试您的查询以检查您所做的真实查询 就我个人而言,我从不使用这种方法,我更喜欢将外键用于另一个表格,例如RolesUser.role_id
我最好使用这种方法在您的应用程序内部提供更大的灵活性 之后我更喜欢使用内部控制器来检查查询的条件,因为在你的方式中,你总是为每个查询搜索学生角色而不是另一个,并且对于角色的其余部分可能是一个问题,因为在控制器内部你会看到一个查找没有条件,但它没有正确的价值,因为在你的模型中有一个特定的条件。

对我而言,好的方法是创建一个新表,使用外键以及控制器内部的条件,以便查看您正在做什么。

答案 1 :(得分: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
     );
);

答案 2 :(得分:0)

关联数据与访问关联模型对象之间存在差异。如果您访问$ this-&gt; Book-&gt; Student,您将访问学生模型并在其范围内工作。已定义关联中的条件仅在被访问对象的上下文中起作用。

因此,如果你在书上找到并找到那本书的学生:

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

您的代码将正常运行。它会找到这本书以及第一个扮演角色的用户。 但是你的关联是错的:它应该是hasMany。因为如果这本书只属于一个学生,你为什么要按角色过滤一本书?

如果要根据角色过滤用户,可以实现在beforeFind()中检查的查询参数,伪代码:if isset roleFilter然后添加争用以从roleFilter中按该角色过滤。

或者,如果您不需要分页,只需在用户模型中创建一个getStudents()方法,该方法将返回具有条件的find('list')。

Student extends User并将过滤器放在beforeFind()中,并使用该模型代替Book关联中的User模型。

如果你想在模型级别或每个模型上进行过滤,我认为最后一个是一个不错的选择。不要忘记设置$useTable$name,否则继承的模型会导致问题。