我因为find()
结果而感到困惑。这是我的配置:
首先,用户可以拥有不同的User.role
值:student
,admin
和其他一些。
// 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 :(得分:0)
你错过了,在你的模特里面 试试这个:
public $belongsTo = array(
'Student' => array(
'className' => 'User',
'foreignKey' => 'student_id', //<------ miss
'conditions' => array('User.role' => 'student')
);
);
Yoi可以调试您的查询以检查您所做的真实查询
就我个人而言,我从不使用这种方法,我更喜欢将外键用于另一个表格,例如Roles
和User.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
,否则继承的模型会导致问题。