【问题标题】:Cakephp beforeFind() - How do I add a JOIN condition AFTER the belongsTo association is added?Cakephp beforeFind() - 如何在添加 belongsTo 关联后添加 JOIN 条件?
【发布时间】:2010-04-28 06:20:19
【问题描述】:

我在 Model->beforeFind($queryData) 中,尝试将 JOIN 条件添加到具有 belongsTo 关联的模型上的 queryData。不幸的是,新的 JOIN 引用了 belongsTo 关联中的一个表,所以它必须出现在查询中的 belongsTo 之后。

这是我的 Tagged->belongsTo 关联:

app\plugins\tags\models\tagged.php (line 192)
Array
(
    [Tag] => Array
        (
            [className] => Tag
            [foreignKey] => tag_id
            [conditions] => 
            [fields] => 
            [order] => 
            [counterCache] => 
        )

    [Group] => Array
        (
            [className] => Group
            [foreignKey] => foreign_key
            [conditions] => Array
                (
                    [Tagged.model] => Group
                )

            [fields] => 
            [order] => 
            [counterCache] => 
        )

)

这里是Tagged->beforeFind()中添加的JOIN,注意belongsTo连接还没有添加:

app\plugins\tags\models\tagged.php (line 194)
Array
(
    [conditions] => Array
        (
            [Tag.keyname] => europe
        )

    [fields] => Array
        (
            [0] => DISTINCT Group.*
            [1] => GroupPermission.*
        )

    [joins] => Array
        (
            [0] => Array
                (
                    [table] => permissions
                    [alias] => GroupPermission
                    [foreignKey] => 
                    [type] => INNER
                    [conditions] => Array
                        (
                            [GroupPermission.model] => Group
                            [0] => GroupPermission.foreignId = Group.id
                            [or] => Array
                                ( ... )
                        )

                )

        )

    [limit] => 
    [offset] => 
    [order] => Array
        (
            [0] => 
        )

    [page] => 1
    [group] => 
    [callbacks] => 1
    [by] => europe
    [model] => Group
)

当我检查输出时,它失败并显示“1054:'on 子句'中的未知列'Group.id'”,因为权限连接出现在组加入之前。

    SELECT DISTINCT `Group`.*, `GroupPermission`.*
    FROM `tagged` AS `Tagged`
    INNER JOIN permissions AS `GroupPermission` ON (`GroupPermission`.`model` = 'Group' AND `GroupPermission`.`foreignId` = `Group`.`id` AND (...))
    LEFT JOIN `tags` AS `Tag` ON (`Tagged`.`tag_id` = `Tag`.`id`)
    LEFT JOIN `groups` AS `Group` ON (`Tagged`.`foreign_key` = `Group`.`id` AND `Tagged`.`model` = 'Group')
    WHERE `Tag`.`keyname` = 'europe'

但是这个 SQL(权限被移到最后)工作正常:

    SELECT DISTINCT `Group`.*, `GroupPermission`.*
    FROM `tagged` AS `Tagged`
    LEFT JOIN `tags` AS `Tag` ON (`Tagged`.`tag_id` = `Tag`.`id`)
    LEFT JOIN `groups` AS `Group` ON (`Tagged`.`foreign_key` = `Group`.`id` AND `Tagged`.`model` = 'Group')
    INNER JOIN permissions AS `GroupPermission` ON (`GroupPermission`.`model` = 'Group' AND `GroupPermission`.`foreignId` = `Group`.`id` AND (...))
    WHERE `Tag`.`keyname` = 'europe'

如何在beforeFind() 中加入beforeFind() 后加入belongsTo ?

【问题讨论】:

  • 您找到解决方案了吗?还是一种解决方法?
  • 我设置了 $model->recursive=-1 并手动添加了所有的连接。
  • 你试过解绑和绑定模型吗??
  • 是的。手动添加连接 == 取消绑定模型。不知道什么时候你会再次绑定它,因为我手动添加了连接并以正确的顺序。

标签: cakephp


【解决方案1】:

连接不能引用关联中的任何内容,因为关联是通过单独的查询获取的。如果您需要添加引用关联的联接,则还需要在联接中手动添加关联。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多