0

这是我的联想:

  • 最喜欢的属于专辑
  • 专辑属于艺术家
  • 艺术家HABTM部分

基本上我想要做的是使用强制连接的可包含行为。如果用户正在查看他所有的收藏夹,我想包含与收藏夹关联的专辑、与该专辑关联的艺术家以及艺术家所属的部分。这对于像这样的可包含行为很容易做到:

$this->Favorite->find('all', array(
    'contain' => array(
        'Album' => array(
            'Artist' => array(
                'Section'
            )
        )
    )
));

我的问题是我还希望用户能够按艺术家和专辑名称进行搜索。不幸的是,我不能这样做:

$this->Favorite->find('all', array(
    ...
    'conditions' => array(
        'OR' => array(
            'Artist.name LIKE' => '%' . $this->request->query['query'] . '%',
            'Album.name LIKE' => '%' . $this->request->query['query'] . '%'
        )
    )
));

为什么?因为 Cake 只会执行第一次连接,Album并且会对艺术家进行单独的查询。所以我不得不做的是删除可包含的行为,并手动进行连接,以便我可以按艺术家和专辑名称进行搜索,如下所示:

$this->Favorite->find('all', array(
    'fields' => array(
        'Favorite.*',
        'Album.*',
        'Artist.*'
    ),
    'conditions' => array(
        'OR' => array(
            'Artist.name LIKE' => '%' . $this->request->query['query'] . '%',
            'Album.name LIKE' => '%' . $this->request->query['query'] . '%'
        )
    ),
    'joins' => array(
        array(
            'table' => 'albums',
            'alias' => 'Album',
            'type' => 'left',
            'foreignKey' => false,
            'conditions' => array('Album.id = Favorite.album_id')
        ),
        array(
            'table' => 'artists',
            'alias' => 'Artist',
            'type' => 'left',
            'foreignKey' => false,
            'conditions' => array('Artist.id = Album.artist_id')
        )
    )
));

这对于能够按艺术家和专辑名称进行搜索非常有用。我的问题是我还想包含艺术家所属的部分。我不能只重新添加contain密钥,因为 Cake 会复制Album连接,这将引发“非唯一表别名”错误。

我的问题是,什么是最好或最有效的方法来获取与每个艺术家相关联的部分,而不必遍历每个收藏夹并为每个收藏夹执行单独的查询?或者这是我必须走的路线?

4

2 回答 2

0

你不能混搭containablejoins所以你需要做一些稍微不同的事情。

使用bindModel 动态创建一些附加关系,然后您可以将新关系用于条件,同时将标准关系用于可包含。

于 2013-06-21T23:52:51.340 回答
-1

好吧,我已经设法通过(肮脏的)黑客解决了这个问题:

$this->Favorite->find('all', array(
    'contain' => array(
        'Album' => array(
            'Artist' => array(
                'Section'
            )
        )
    ),
    'conditions' => array(
        'OR' => array(
            '(SELECT name FROM artists WHERE id = Album.artist_id) LIKE' => '%' . $this->request->query['query'] . '%',
            'Album.name LIKE' => '%' . $this->request->query['query'] . '%'
        )
    )
));
于 2013-06-23T17:54:14.850 回答