Mysql CakePHP 2.5通过可包含键进行复杂查找过滤

Mysql CakePHP 2.5通过可包含键进行复杂查找过滤,mysql,pagination,cakephp-2.0,cakephp-2.3,Mysql,Pagination,Cakephp 2.0,Cakephp 2.3,我有4张桌子相互连接 人才表 +--------------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------------+------------------+------+-----+---------+-------

我有4张桌子相互连接

人才表

+--------------------+------------------+------+-----+---------+----------------+
| Field              | Type             | Null | Key | Default | Extra          |
+--------------------+------------------+------+-----+---------+----------------+
| id                 | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| created            | datetime         | YES  |     | NULL    |                |
| user_id            | int(10) unsigned | NO   |     | NULL    |                |
| firstname          | varchar(128)     | NO   |     | NULL    |                |
| lastname           | varchar(128)     | NO   |     | NULL    |                |
| phone_num          | varchar(32)      | NO   |     | NULL    |                |
+--------------------+------------------+------+-----+---------+----------------+
此表将包含以下行:

+----+-----------+------------+
| id | firstname | lastname   |
+----+-----------+------------+
|  1 | barney    | stinson    |
|  2 | Ted       | Mosby      |
+----+-----------+------------+
+----+-------------------+-----------------+
| id | name              | slug            |
+----+-------------------+-----------------+
|  1 | actor / actress   | actor-actress   |
|  2 | dancer            | dancer          |
|  3 | model             | model           |
|  4 | singer / musician | singer-musician |
+----+-------------------+-----------------+
人才分类表

+----------------+------------------+------+-----+---------+----------------+
| Field          | Type             | Null | Key | Default | Extra          |
+----------------+------------------+------+-----+---------+----------------+
| id             | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| created        | datetime         | NO   |     | NULL    |                |
| talent_id      | int(10) unsigned | NO   |     | NULL    |                |
| talent_name_id | int(11)          | NO   |     | NULL    |                |
| is_active      | tinyint(1)       | NO   |     | 1       |                |
+----------------+------------------+------+-----+---------+----------------+
TalentName表

+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| id           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| created      | date             | NO   |     | NULL    |                |
| name         | varchar(128)     | NO   |     | NULL    |                |
| slug         | varchar(255)     | NO   |     | NULL    |                |
| talent_count | int(11)          | NO   |     | NULL    |                |
+--------------+------------------+------+-----+---------+----------------+
此表将包含以下行:

+----+-----------+------------+
| id | firstname | lastname   |
+----+-----------+------------+
|  1 | barney    | stinson    |
|  2 | Ted       | Mosby      |
+----+-----------+------------+
+----+-------------------+-----------------+
| id | name              | slug            |
+----+-------------------+-----------------+
|  1 | actor / actress   | actor-actress   |
|  2 | dancer            | dancer          |
|  3 | model             | model           |
|  4 | singer / musician | singer-musician |
+----+-------------------+-----------------+
和TalentMedia表

+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| id           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| created      | datetime         | NO   |     | NULL    |                |
| talent_id    | int(10) unsigned | NO   |     | NULL    |                |
| media_id     | int(10) unsigned | NO   |     | NULL    |                |
| is_cover     | tinyint(1)       | NO   |     | 0       |                |
| is_avatar    | tinyint(1)       | NO   |     | 0       |                |
| like_count   | int(11)          | NO   |     | 0       |                |
| view_count   | int(11)          | NO   |     | 0       |                |
| is_published | tinyint(1)       | NO   |     | 0       |                |
| is_deleted   | tinyint(1)       | NO   |     | 0       |                |
| is_approved  | tinyint(1)       | NO   |     | 0       |                |
| is_suspended | tinyint(1)       | NO   |     | 0       |                |
+--------------+------------------+------+-----+---------+----------------+
人才有许多属于人才名称的人才类别

天才有很多才能

我正在努力实现这一目标

SELECT 

Talent.id,
Talent.firstname,
Talent.lastname,
TalentCategory.id,
TalentCategory.talent_id,
TalentCategory.talent_name_id,
TalentName.name,
TalentName.id,
TalentMedia.talent_id,
TalentMedia.media_id,
TalentMedia.is_suspended,
TalentMedia.is_avatar,
TalentMedia.is_cover


FROM talents AS Talent

JOIN talent_talents AS TalentCategory ON TalentCategory.talent_id = Talent.id
JOIN talent_names AS TalentName ON TalentName.id = TalentCategory.talent_name_id
JOIN talent_medias AS TalentMedia ON TalentMedia.talent_id = Talent.id

WHERE TalentName.id = 4 AND TalentMedia.is_suspended != 1 AND TalentMedia.is_cover !=1 AND TalentMedia.is_avatar = 1
GROUP BY Talent.id

下面是描述所需输出的示例

从我的控制器,以便我可以实现它在我的分页设置。我什么都试了,运气都不好

我尝试了或,但我不太理解文档


请帮助我如何实现这一点

我通过创建自定义分页成功地实现了这一点,我不知道这是否是正确的方法,至少我的解决方案目前还有效

首先,我重写Cake的paginate和paginateCount方法

$this->paginateQuery上的值;与查询相同

我还需要稍微修改$conditions,因为它是一个数组,所以我需要以某种方式将数组压缩到某个可接受的where条件

接下来在我的控制器中,我调用

$this->Paginator->settings = array(
    'Talent' => array(
        'limit' => 1,
        'conditions' => array(
            'TalentCategory = ' => 3,
            'TalentMedia.is_suspended !=' => 1,
            'TalentMedia.is_cover     !=' => 1,
            'TalentMedia.is_avatar    = ' => 1,
            //and any other conditions related to the joined table
        )
    )
);
$this->set('talents', $this->Paginator->paginate('Talent'));

你的数据库结构看起来有点不对劲。如果一个天赋有很多天赋类别,那么你应该分别获取天赋和天赋类别。不?@AngelS.Moreno嗯,我不太明白你的问题,一个天赋可以有很多天赋类别。巴尼·斯丁森是一个演员、歌手和舞蹈家,这就是为什么我必须这样绘制它。我更新我的,希望它有助于解释如果你喜欢,考虑下面这个简单的两步行动:1。如果您还没有这样做,请提供适当的DDL和/或SQLFIDLE,以便我们可以更轻松地复制问题。2.如果您还没有这样做,请提供与步骤1中提供的信息相对应的所需结果集。@问题是,问题不在sql或查询中,我可以很好地获取行,问题实际上是,如何在CakePHP find方法中实现它?无论如何,我更新了问题,提供了一个小提琴