cakephp查找(全部)优化

cakephp查找(全部)优化,cakephp,relationship,Cakephp,Relationship,我正在使用cakephp 2.5.2 我有五张桌子 1-用户 2-项目 3-标签 4-项目标签 5-图像 一个用户可以有许多项目 一个项目可以有许多(标记、图像) 我有两个问题 $projects = $this->Project->find('all',array('conditions'=>array('User.id'=>$this->Auth->user('id')))); debug($projects);exit(); 这给 array( (in

我正在使用cakephp 2.5.2
我有五张桌子

1-用户
2-项目
3-标签
4-项目标签
5-图像

一个用户可以有许多项目
一个项目可以有许多(标记、图像)

我有两个问题

$projects = $this->Project->find('all',array('conditions'=>array('User.id'=>$this->Auth->user('id'))));
debug($projects);exit();
这给

array(
(int) 0 => array(
    'Project' => array(
        'id' => '1',
        'name' => 'project 1'
    ),
    'User' => array(
        'password' => '*****',
        'id' => '1',
        'name' => 'User 1',
        'email' => 'user1@gmail.com'
    ),
    'Image' => array(),
    'ProjectTag' => array(
        (int) 0 => array(
            'id' => '1',
            'project_id' => '1',
            'tag_id' => '1'
        ),
        (int) 1 => array(
            'id' => '2',
            'project_id' => '1',
            'tag_id' => '8'
        ),
        (int) 2 => array(
            'id' => '3',
            'project_id' => '1',
            'tag_id' => '6'
        ),
        (int) 3 => array(
            'id' => '4',
            'project_id' => '1',
            'tag_id' => '10'
        ),
        (int) 4 => array(
            'id' => '5',
            'project_id' => '1',
            'tag_id' => '4'
        )
    )
),
(int) 1 => array(
    'Project' => array(
        'id' => '2',
        'name' => 'project 2'
    ),
    'User' => array(
        'password' => '*****',
        'id' => '1',
        'name' => 'user 1',
        'email' => 'user1@gmail.com'
    ),
    'Image' => array(),
    'ProjectTag' => array(
        (int) 0 => array(
            'id' => '6',
            'project_id' => '2',
            'tag_id' => '1'
        ),
        (int) 1 => array(
            'id' => '7',
            'project_id' => '2',
            'tag_id' => '8'
        ),
        (int) 2 => array(
            'id' => '8',
            'project_id' => '2',
            'tag_id' => '4'
        )
    )
)
)

我需要Project&ProjectTag数组,但不需要用户和图像数组
我尝试了递归-1,0,1,2,但无法获得所需的内容

我的问题2是
如何找到标记为“html”的项目

$projects = $this->Project->find('all',array('conditions'=>array('Tag.tag'=>'HTML')));
上面说

错误:SQLSTATE[42S22]:未找到列:1054“where子句”中的未知列“Tag.Tag”


首先,请注意。始终使用
$recursive=-1。理想的做法是在AppModel中设置它,然后再也不要搞递归了。如果您想获得额外的数据,请使用,而不是递归

总体问题-您不能针对递归(或包含的)模型添加条件,这似乎是您在两个问题中所做的。如果要针对正在查找的模型以外的模型设置条件,则需要使用联接或交换查询以在另一个模型上运行

对问题1的回答

更改此项:

$projects = $this->Project->find('all',array(
    'conditions'=>array(
        'User.id'=>$this->Auth->user('id')
    )
));
为此:

$projects = $this->Project->find('all',array(
    'conditions'=>array(
        'user_id'=>$this->Auth->user('id')  // <-- notice this
    ),
    'contain' => array(
        'ProjectTag' => array(
            'Tag' // <-- optional, as you didn't mention you needed
        )
    )
));

另一种方法是将查询交换为在标记上运行,只需使用
contain
来包含该标记的项目。我更喜欢join,因为如果您能够扩展它来检索不止一个标记的项目,那么您的数据将仍然是易于使用的,而不是Containable,它会将您的项目放在不同的数组中对应的标记下。

如果您想在CakePHP中优化查询,请关闭recursive(将其设置为-1),然后使用containable行为精确地选择所需的数据

对于您的特定查询,默认情况下,关联模型是通过左联接获取的,这意味着如果您从项目中进行查询,您将获得所有项目以及它们的标记字段中包含“html”的任何标记。解决此问题的最简单方法是从标记中进行搜索:

$tags = $this->Tag->find('first', array('conditions' => array('tag' => 'html'), 'contain' => array('Project')));

这将获得标记字段中带有“html”的标记,以及与之相关的所有项目。

回答1:可行,但它不包括与项目相关的标记,项目表通过关联表project_标记链接到标记表,因为它具有多对多关系,我想用标记名称显示项目,标记名称在标记表中,虽然project_tags没有标记名,但它只有标记id。这有意义吗?更新了我认为您正在寻找的答案,但我认为任何进一步的更新/调整都可以通过您使用我答案中的整体想法来完成。
$tags = $this->Tag->find('first', array('conditions' => array('tag' => 'html'), 'contain' => array('Project')));