Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Model::find()时关联的CakePHP条件子句_Cakephp - Fatal编程技术网

使用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'));