这是我的联想:
- 最喜欢的属于专辑
- 专辑属于艺术家
- 艺术家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
连接,这将引发“非唯一表别名”错误。
我的问题是,什么是最好或最有效的方法来获取与每个艺术家相关联的部分,而不必遍历每个收藏夹并为每个收藏夹执行单独的查询?或者这是我必须走的路线?