使用Model::find()时关联的CakePHP条件子句
我只是因为一个使用Model::find()时关联的CakePHP条件子句,cakephp,Cakephp,我只是因为一个find()结果而感到困惑。这是我的配置: 首先,用户可以有不同的User.role值:student、admin,以及其他一些值 // Book public $belongsTo = array( 'Student' => array( 'className' => 'User', 'foreignKey' => 'student_id' 'conditions' => array('User.ro
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'
的用户,但它会获得所有用户。这里发生了什么,关联定义的条件是什么,在哪里可以使用,在哪里不能使用。任何线索都会有帮助的,谢谢
PS:我知道我可以在find()
上设置条件,这不是问题所在在您的模型中,您没有找到。
试试这个:
public $belongsTo = array(
'Student' => array(
'className' => 'User',
'foreignKey' => 'student_id', //<------ miss
'conditions' => array('User.role' => 'student')
);
);
public$belongsTo=array(
“学生”=>数组(
'className'=>'User',
'foreignKey'=>'student\u id',//数组('User.role'=>'student')
);
);
Yoi可以调试您的查询以检查您所做的真正查询。
就我个人而言,我从未使用过这种方法,我更喜欢在另一个表中使用外键,例如角色
和用户.role\u id
对我来说,最好使用这种方法,使您的应用程序具有更大的灵活性。
之后,我更喜欢使用控制器内部的条件来检查查询,因为在您的方式中,您搜索的每个查询始终是学生角色,而不是其他角色,对于角色的其余部分可能是一个问题,因为在控制器内部,您可以看到一个没有条件的查找,但它并没有获得正确的值,因为在您的模型中有一个特定的条件
对我来说,最好的方法是创建一个新表,使用外键和控制器动作内部的where条件来查看您正在做什么。对于默认值所有关系都是“左连接”,您必须将参数“类型”设置为“内部”值
//本书
public$belongsTo=数组(
“学生”=>数组(
'className'=>'User',
'foreignKey'=>'student\u id'
“条件”=>array('Student.role'=>'Student'),//'internal',//关联数据和访问关联模型对象之间存在差异。如果访问$this->Book->Student,则访问学生模型并在其范围内工作。定义关联中的条件仅在访问对象的上下文中工作
因此,如果你在书中查找并列出该书的学生:
$this->Book->find('first', array('contain' => array('Student'));
您的代码将正常工作。它将找到该书以及第一个拥有stundent角色的用户。但是您的关联是错误的:它应该有很多。因为如果该书只属于一个学生,为什么要按角色筛选该书
如果要按角色筛选用户,可以实现在beforeFind()中签入的查询参数,伪代码:如果是设置roleFilter,则从roleFilter中将争用添加到该角色筛选
或者,如果不需要分页,只需在用户模型中创建一个getStudents()方法,该方法将返回具有条件的find('list')
或者Student扩展用户
并将过滤器放入beforeFind()中,并使用该模型而不是图书关联中的用户模型
如果您想在模型级别或每个模型上进行筛选,我认为最后一个是一个很好的选择。不要忘记设置$useTable
和$name
,否则继承的模型将导致问题。很抱歉,我在帖子中输入了一个错误,代码很好。现在我研究了一点,是不是模型链接(即$this->Book->Student->find()
)与$this->Book->find()不同包含学生?也许我对模型链接有错误的想法是一样的,但我建议你不要将where条件放在控制器中,而不是放在model@christopherranciscodoesn中。这些关系在模型链接时有效还是只对自身有效?也许这就是问题所在,因为SQL日志没有说明也没有留下连接也不是内部连接。这两者都适用。如果你只想得到学生,你必须在find方法中添加条件,因为这种关系适用于所有模型。
$this->Book->find('first', array('contain' => array('Student'));