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