CakePHP和HABTM模型极限误差
我有一系列的博文模型,它们都属于许多媒体模型。在Post模型内部的某些函数调用中,我不需要检索整个媒体模型列表。但是,当我使用以下代码时:CakePHP和HABTM模型极限误差,php,mysql,cakephp,Php,Mysql,Cakephp,我有一系列的博文模型,它们都属于许多媒体模型。在Post模型内部的某些函数调用中,我不需要检索整个媒体模型列表。但是,当我使用以下代码时: $this->unbindModel( array('hasAndBelongsToMany' => array('Media')) ); // Rebind to get only the fields we need: $this->bindModel( array('hasAndBelongsToMany' =>
$this->unbindModel( array('hasAndBelongsToMany' => array('Media')) );
// Rebind to get only the fields we need:
$this->bindModel(
array('hasAndBelongsToMany' => array(
'Media' => array(
'className' => 'Media',
'joinTable' => 'media_posts',
'foreignKey' => 'post_id',
'associationForeignKey' => 'media_id',
'limit' => 1,
'fields' => array('Media.type', 'Media.path', 'Media.title')
)
)
)
);
$this->find('all', $params);
此限制仅适用于第一个检索到的Post模型之一,并且以下所有Post模型都没有关联的媒体:
Array
(
[0] => Array
(
[Profile] => Array
(
)
[Media] => Array
(
[0] => Array
(
[type] => photo
[path] => ''
[title] => ''
)
)
)
[1] => Array
(
[Profile] => Array
(
)
[Media] => Array
(
)
)
)
任何建议都很好。谢谢 试试这个:
$this->yourModel->hasAndBelongsToMany['Media'] = false; // or null
然后手动设置您的HABTM关联
$this->yourModel->hasAndBelongsToMany['Media'] = array(........);
或者只需修改关联而不将其置零:
$this->yourModel->HABTM['Media']['fields'] = array(....)
试试这个:
$this->yourModel->hasAndBelongsToMany['Media'] = false; // or null
然后手动设置您的HABTM关联
$this->yourModel->hasAndBelongsToMany['Media'] = array(........);
或者只需修改关联而不将其置零:
$this->yourModel->HABTM['Media']['fields'] = array(....)
Cake在一次批处理查询中获取所有与Habtm相关的记录,然后将它们组合到结果数组中。您在关联中指定的任何附加条件都将按查询中的原样使用,因此其外观如下所示:
SELECT … FROM Media WHERE Media.id in (1, 2, 3, …) LIMIT 1
所以它只能检索一个HABTM模型
显然没有简单的解决办法。也许你可以再考虑一下原始的前提,为什么第一个LIMIT 1记录应该是正确的,也许你可以找到一个不同的条件来查询
如果做不到这一点,你可以重新绑定你的模型,这样媒体就可以和媒体的透视表有很多关系。对于hasMany和belongsTo查询,Cake会自动加入查询。然后,您可以使用GROUPBY子句,这将为您提供所需的结果:
SELECT … FROM Media JOIN medias_posts … GROUP BY medias_posts.post_id
您可能还想尝试在查询中传递'join'参数,以在不进行大量重新绑定的情况下实现该效果
$this->Media->find('all', array('join' => array(…), …));
Cake在一次批处理查询中获取所有与Habtm相关的记录,然后将它们组合到结果数组中。您在关联中指定的任何附加条件都将按查询中的原样使用,因此其外观如下所示:
SELECT … FROM Media WHERE Media.id in (1, 2, 3, …) LIMIT 1
所以它只能检索一个HABTM模型
显然没有简单的解决办法。也许你可以再考虑一下原始的前提,为什么第一个LIMIT 1记录应该是正确的,也许你可以找到一个不同的条件来查询
如果做不到这一点,你可以重新绑定你的模型,这样媒体就可以和媒体的透视表有很多关系。对于hasMany和belongsTo查询,Cake会自动加入查询。然后,您可以使用GROUPBY子句,这将为您提供所需的结果:
SELECT … FROM Media JOIN medias_posts … GROUP BY medias_posts.post_id
您可能还想尝试在查询中传递'join'参数,以在不进行大量重新绑定的情况下实现该效果
$this->Media->find('all', array('join' => array(…), …));
为什么不使用
编辑:
刚刚尝试过,得到了以下sql模块标记:
及
显然,这无法返回所需的结果,因为您必须对每个模块结果进行查询,这将再次导致过多的查询
作为结论,我将返回示例中的所有标记,因为太多结果行的开销比太多查询的开销好。为什么不使用
编辑:
刚刚尝试过,得到了以下sql模块标记:
及
显然,这无法返回所需的结果,因为您必须对每个模块结果进行查询,这将再次导致过多的查询
作为结论,我将在我的示例中返回所有标记,因为太多结果行的开销比太多查询的开销好。CakePHP有一个非常强大的工具用于此CakePHP有一个非常强大的工具用于此就是这样!实际上,我以前在Post模型上使用过containable行为,但我没有意识到我可以在那里进行限制。谢谢事实上,我收回了。这似乎只适用于查找“第一”呼叫,而不适用于媒体模式的查找“全部”。这不适用于我处理的任何其他HABTM相关模型。有什么想法吗?你知道,我在比较了一些相同的模型后得出了相同的结论:忽略开销,因为它比只检索一个关联模型的开销要小。不过,谢谢你的帮助!就这样!实际上,我以前在Post模型上使用过containable行为,但我没有意识到我可以在那里进行限制。谢谢事实上,我收回了。这似乎只适用于查找“第一”呼叫,而不适用于媒体模式的查找“全部”。这不适用于我处理的任何其他HABTM相关模型。有什么想法吗?你知道,我在比较了一些相同的模型后得出了相同的结论:忽略开销,因为它比只检索一个关联模型的开销要小。不过,谢谢你的帮助!