Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP和HABTM模型极限误差_Php_Mysql_Cakephp - Fatal编程技术网

CakePHP和HABTM模型极限误差

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' =>

我有一系列的博文模型,它们都属于许多媒体模型。在Post模型内部的某些函数调用中,我不需要检索整个媒体模型列表。但是,当我使用以下代码时:

$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相关模型。有什么想法吗?你知道,我在比较了一些相同的模型后得出了相同的结论:忽略开销,因为它比只检索一个关联模型的开销要小。不过,谢谢你的帮助!