【发布时间】: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