CakePHP:在一个';查找';条件,返回重复的结果

CakePHP:在一个';查找';条件,返回重复的结果,cakephp,model,associations,cakephp-2.0,Cakephp,Model,Associations,Cakephp 2.0,我读过很多帖子,花了数小时浏览cakephp.org上的文档,甚至尝试过各种实际例子,但我似乎无法正确理解这一点。我有以下三个表格: 计划 项目标签 标签 当有人添加新项目时,他们会选择自己的标记,这些标记是从标记表中的预定义列表中选择的。然后,他们输入的标记将使用“项目id”和“标记id”字段存储在“项目标记”中 模型关系如下: Project有许多projectTag projectTag属于项目 ProjectTag belongsTo标签 我是否有正确的关系对我来说仍然微不足道,

我读过很多帖子,花了数小时浏览cakephp.org上的文档,甚至尝试过各种实际例子,但我似乎无法正确理解这一点。我有以下三个表格:

  • 计划
  • 项目标签
  • 标签
当有人添加新项目时,他们会选择自己的标记,这些标记是从标记表中的预定义列表中选择的。然后,他们输入的标记将使用“项目id”和“标记id”字段存储在“项目标记”中

模型关系如下:

  • Project有许多projectTag
  • projectTag属于项目
  • ProjectTag belongsTo标签
我是否有正确的关系对我来说仍然微不足道,但我在这里尝试了许多可能性

我试图做的是对特定标记的所有项目执行查找。为此,我采取了以下措施:

$this->Project->contain(array('ProjectTag' => 'Tag', 'User' => array('id')));
$projects = $this->Project->find('all', array('conditions' => array('ProjectTag.tag_id' => '6')));
结果是一个SQL错误,列ProjectTag.tag_id不存在。这告诉我关联中存在错误,但在哪里

这是因为在使用Containeable时,我不能在我喜欢的条件下使用二级深度关联的hasMany模型吗?如果是,我该如何更正

我知道很长,对不起。有人能解释一下这种奇怪的情况吗

我尝试过的另一种方法是在Project上使用unbindModel(),删除对ProjectTag的所有绑定,然后使用bindModel()添加一个hasOne,条件是ProjectTag.Project\u id=Project.id,但这导致返回同一项目的4条记录,每个ProjectTag一条,这似乎不正确

我正在使用containable行为,并在AppModel中设置recursive=-1

非常感谢您的帮助。
谢谢

你的问题是,你在模型中的关系是错误的。 理想情况下,你的情况是一种关系,一种关系

项目hasAndBelongsToMany标签 Tag hasAndBelongsToMany项目

这是这种情况下的自然关系。projectTag表只是一个中间表,而不是cakephp中的模型


有关更多信息:

您的问题是,您在模型中的关系中出错。 理想情况下,你的情况是一种关系,一种关系

项目hasAndBelongsToMany标签 Tag hasAndBelongsToMany项目

这是这种情况下的自然关系。projectTag表只是一个中间表,而不是cakephp中的模型


欲了解更多信息:

对于所有可能偶然发现本文的人,尝试在您的查找或分页查询中包含深度为2+级的模型至少可以说不是一项简单的任务

不断提出的第一点是CakePHP对每个hasMany和HasAndBelongToMany关联执行单独的查询,这使得几乎不可能将它们包含在查找条件中

我得到了2个解决方案:

1) 生成自定义查询类型

2) 使用unbindModel和bindModel函数,并将关联重新创建为hasOne

我选择了第2点,因为当我阅读文档时,第1点似乎有问题(并且只是作为最后的手段被推荐),它允许我动态地更改关联,然后重新设置关联,并按照我的意图愉快地继续关联

对于那些感兴趣的人,我有一个模型项目,它有许多属于sto标记的ProjectTag。在我的查找类型中无法使用Tag或ProjectTag,因此我执行了以下操作:

$this->Project->contain(array('ProjectTag' => 'Tag', 'User' => array('id')));
$projects = $this->Project->find('all', array('conditions' => array('ProjectTag.tag_id' => '6')));
我对Project、ProjectTag和Tag使用了unbindModel()方法,删除了它们的所有关联,基本上取消了所有关系的链接

然后我将bindModel()应用于Project、ProjectTag和Tag。最重要的是我应用了这些Ninding的顺序(层次结构),因为我使用了“condition”属性,它允许我使用SQL WHERE条件将模型“A”链接到模型“B”。例如:

$this->Project->ProjectTag->unbindModel(array(
'belongsTo' => array('Tag')
));

$this->Project->unbindModel(array('hasMany' => array('ProjectTag')));

$this->Project->bindModel(array('hasOne' => array('ProjectTag' => array('foreignKey' => false, 'conditions' => array('ProjectTag.project_id = Project.id')))));

$this->Project->bindModel(array('hasOne' => array('Tag' => array('foreignKey' => false, 'conditions' => array('Tag.id = ProjectTag.tag_id')))));
我们现在可以使用Tag.id,就好像它与项目有一个hasOne关系一样,本质上允许我们在返回相关项目时直接在标记上应用find条件

您必须解除所讨论模型使用的所有关系的绑定,否则它将中断


我希望这能帮助那些偶然发现同样问题的人。

对于所有可能偶然发现这篇文章的人来说,尝试在你的查找或分页查询中包含2+级关联的模型至少不是一件小事

不断提出的第一点是CakePHP对每个hasMany和HasAndBelongToMany关联执行单独的查询,这使得几乎不可能将它们包含在查找条件中

我得到了2个解决方案:

1) 生成自定义查询类型

2) 使用unbindModel和bindModel函数,并将关联重新创建为hasOne

我选择了第2点,因为当我阅读文档时,第1点似乎有问题(并且只是作为最后的手段被推荐),它允许我动态地更改关联,然后重新设置关联,并按照我的意图愉快地继续关联

对于那些感兴趣的人,我有一个模型项目,它有许多属于sto标记的ProjectTag。在我的查找类型中无法使用Tag或ProjectTag,因此我执行了以下操作:

$this->Project->contain(array('ProjectTag' => 'Tag', 'User' => array('id')));
$projects = $this->Project->find('all', array('conditions' => array('ProjectTag.tag_id' => '6')));
我对Project、ProjectTag和Tag使用了unbindModel()方法,删除了它们的所有关联,基本上取消了所有关系的链接

然后我将bindModel()应用于Project、ProjectTag和Tag。最重要的是我应用了这些Ninding的顺序(层次结构),因为我使用了“condition”属性,它允许我使用SQL WHERE条件将模型“A”链接到模型“B”。例如:

$this->Project->ProjectTag->unbindModel(array(
'belongsTo' => array('Tag')
));

$this->Project->unbindModel(array('hasMany' => array('ProjectTag')));

$this->Project->bindModel(array('hasOne' => array('ProjectTag' => array('foreignKey' => false, 'conditions' => array('ProjectTag.project_id = Project.id')))));

$this->Project->bindModel(array('hasOne' => array('Tag' => array('foreignKey' => false, 'conditions' => array('Tag.id = ProjectTag.tag_id')))));
我们现在可以使用Tag.id,就好像它与项目有一个hasOne关系一样,本质上允许我们应用它