CakePHP:无法识别 hasMany 关联

Posted

技术标签:

【中文标题】CakePHP:无法识别 hasMany 关联【英文标题】:CakePHP: hasMany association not recognized 【发布时间】:2013-11-27 13:55:53 【问题描述】:

尝试属于用户(用户有很多尝试)。

在 User.php(模型)中

public $hasMany = array (
    'Attempt'   =>  array(
        'className'     =>  'Attempt',
        'order' => 'modified DESC'
    ), 
);

在 Attempt.php(模型)中

    public $belongsTo = array (
        'Test' => array ('className' => 'Test', 'foreignKey'=>'test_id', 'order' => 'Test.created DESC'),
        'User' => array ('className' => 'User', 'order' => 'User.created DESC')
    );

在控制器中,我构造了这个查询...

$joins = array(

        array( 
            'table'=>'attempts',
            'alias'=>'Attempt',
            'type'=>'LEFT',
            'conditions'=>array("Attempt.user_id = User.id AND Attempt.test_id != $practice_test_id")
        )

    );

$conditions[] = array('Resume.has_file = 1');

$search_options = array( 'conditions'=>$conditions, 
    //'joins' => $joins, //<--I'M FORCED TO USER THIS TO GET THIS TO WORK
    'contain' => array('Resume', 'Attempt', 'Tag'),
    'order' => array('Attempt.score'=> 'DESC'),
    'group' => 'User.id'
);
$paginator_settings = $search_options;
$paginator_settings['limit'] = 25;
$this->Paginator->settings = $paginator_settings;

$resume_display_array = $this->Paginator->paginate('User');

(这里看起来有点奇怪,因为我去掉了很多在构造这个查询之间发生的分散注意力的逻辑。这些条件大部分是根据用户输入动态构建的。)

当我省略 $search_options['joins] 时,这不起作用。我收到以下错误:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Attempt.score' in 'order clause'

SQL 转储看起来像这样:

SELECT `User`.`id`
FROM `users` AS `User` 
LEFT JOIN `resumes` AS `Resume` ON (`Resume`.`user_id` = `User`.`id`) 
WHERE `User`.`id` IN (
    SELECT `User1`.`id` FROM `users` AS User1 
    LEFT JOIN `tags_users` AS TagUser ON (`User1`.`id`= `TagUser`.`user_id`) 
    LEFT JOIN `tags` AS Tag ON (`TagUser`.`tag_id`= `Tag`.`id`) 
    WHERE `Tag`.`id` = (2) ) AND `Resume`.`has_file` = 1 GROUP BY `User`.`id` 
ORDER BY `Attempt`.`score` DESC 
LIMIT 25

为什么 Attempt 模型由于与 User 的 hasMany 关系而没有自动包含在内?

【问题讨论】:

如果您将该 SQL 复制并粘贴到您的数据库中,它会返回一些内容吗? Attempts 表中是否存在“分数”列? 【参考方案1】:

我认为这里没有问题。其实你other question里的答案不是今天贴出来的吗?

但 hasMany 和 hasAndBelongsToMany 并非如此 协会。这就是强制加入来拯救的地方。你 只需要定义必要的连接来组合表并获得 查询所需的结果。

所以,据我了解,在谈论hasMany 时,您必须强制加入关系,对吗?这就是您在使用 $joins 数组时所做的事情。由于User hasMany Attempt,那么您将不得不强制加入。现在,如果您从Attempt 的角度进行分页,那可能就没有必要了。如果您执行$this-&gt;Paginator-&gt;paginate('Attempt');(更改必要的关系和条件),则无需手动加入用户表来获取数据。

因此,如果Attempt 自身没有加入(如文档所述),那么订单条件会产生问题,因为在另一个查询中检索到Attempt 数据并且表引用在第一个查询。解决方案:进行连接,蛋糕的行为符合预期。

【讨论】:

另一个问题是关于 CakePHP 文档中的冲突信息(在与此问题相关的部分中)。我不清楚/不清楚预期的行为应该是什么。您关于 Paginator 的“观点”的观点是正确的,但我们不是对有许多“尝试”的“用户”模型进行分页吗?那么我们不应该期望自动魔术在没有强制加入的情况下工作吗?如果相关,查询是在使用 loadModel('User') 后从不同的控制器内部进行的。 我知道这不是一个重复的问题,我只是指出了这一点,因为我从那里得到了解决方案。但是看,如果我们对 User 模型进行分页,我们不应该期望 automagic 工作,因为文档说 它不会工作,除非你强制它,不管你从哪个控制器做查询:hashMany 和 HABTM 关联需要强制加入 我知道文档是这么说的,但它对我们在其他任何地方都不起作用。我们还有其他几个具有 hasMany 和 hasAndBelongsToMany 关联的模型示例,它们会自动出现而无需任何连接。这就是奥秘的基础。不过让我们在那边聊天或发布后续的cmets,以免在这里脱轨。 您能否发布另一个以相反方式工作的示例?看看你的意思。 在此处添加它会让人感到困惑,因为您需要查看模型和控制器中的 find() 以及返回的数据。我可以在聊天中向您展示,或者我可以稍后将这些详细信息添加到另一张工单中。【参考方案2】:

我认为你的 hasMany 关联中有一个错字——className 有一个大写 N。

我也会尝试测试$this-&gt;User-&gt;recursive = 2; $this-&gt;User-&gt;find('first');,看看它会返回什么。如果结果不包括尝试,我会假设您设置模型关系的方式有问题。

【讨论】:

谢谢。 className 是一个错字,我会马上修正。至于模型关系......他们在上面发布。你觉得他们有什么问题吗? 除了类名之外,我没有看到任何突出的东西。我只是建议检查一下,因为您看到的行为就像关联不起作用。 我同意它不起作用。弄清楚为什么是这个问题的重点。【参考方案3】:

试试这个就行了

  $this->User->bindModel(array('hasMany' => array(
            'FollowUp' => array('className' => 'FollowUp', 'foreignKey' => 'publisher_id',
            'fields' => array('amount'),
        ),
        'SchoolFollow' => array('className' => 'SchoolFollow', 'foreignKey' => 'publisher_id',
            'fields' => array('amount'),
        ),
        'TravelerFollow' => array('className' => 'TravelerFollow', 'foreignKey' => 'publisher_id',
            'fields' => array('amount'),
        ),
        $mdl . 'Cashback' => array('className' => $mdl . 'Cashback', 'foreignKey' => 'publisher_id',
            'fields' => array('admin_comission_amount'),
            'conditions' => array('status' => 'done')
        ),
)));

【讨论】:

以上是关于CakePHP:无法识别 hasMany 关联的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP - 在模型中查找没有 hasMany 关系的 hasMany 关联?

CakePHP 模型关联 HasMany - 保存错误

Cakephp 2.8.4 忽略 hasMany

CakePHP hasAndBelongsToMany vs hasMany 通过

CakePHP如何在一个saveAll中不知道外键的情况下创建hasMany数据?

CakePHP - 如何一次通过记录保存单个 hasMany,每个 hasMany 有多个 belongsTo 记录?