2014-09-27 1 views
0

У меня есть 4 таблицы, связанные друг с другомCakePHP 2.5 комплекс находка фильтрации по Containable ключа

Talent стол

+--------------------+------------------+------+-----+---------+----------------+ 
| 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  | 
+----+-----------+------------+ 

TalentCategory таблицы

+----------------+------------------+------+-----+---------+----------------+ 
| 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 | 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  |    | 
+--------------+------------------+------+-----+---------+----------------+ 

Талант hasMany TalentCategory belongsTo TalentName

Талант hasMany TalentMedia

я пытаюсь достичь

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 

или

select all talents which is a singer/musician that avatar is not suspended 

вот SqlFiddle описания желаемого выхода

из моего контроллера, так что я могу реализовать его в моих настройках Paginator , я пробовал все без везения.

Я пробовал custom find types или custom query pagination, но я не совсем понимаю документацию.

пожалуйста, помогите мне о том, как достичь этого

+0

вашей структуры БД выглядит немного прочь. Если у Таланта есть много TalentCategory, то вы должны получать Талант и TalentCategory отдельно? –

+0

@AngelS.Морено, я не совсем понимаю ваш вопрос, у таланта может быть много talent_categories (Барни Стинсон - актер, певец и танцор), вот почему я должен его сопоставлять. i обновил мой, надеюсь, что это поможет объяснить – littlechad

+0

Если вам нравится, подумайте о следующем простом двухэтапном курсе действий: 1. Если вы еще этого не сделали (вы этого не сделали), укажите * надлежащие * DDL (и/или sqlfiddle), чтобы мы могли легче воспроизвести проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, который соответствует информации, предоставленной на шаге 1. – Strawberry

ответ

0

мне удалось получить эту работу путем создания пользовательского разбиения на страницы, я не знаю, если это правильный подход, по крайней мере, мое решение работает сейчас

Сначала я переопределять торта paginate и paginateCount метод

public function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()) { 
    $recursive = -1; 
    $sql_query = $this->paginateQuery; //same query as [SqlFiddle][1] 

    if(!empty($conditions)){ 
     $sql_query .= 'WHERE '; 
     foreach ($conditions as $key => $cond) { 
      $cond_str[] = $key .' '. $cond; 
     } 
     $sql_query .=implode(" AND ", $cond_str)." "; 

    } 

    $sql_query .= "GROUP BY Talent.id "; 
    $sql_query .= "ORDER BY Talent.id DESC "; 
    $sql_query .= "LIMIT " . (($page - 1) * $limit) . ', ' . $limit; 

    $results = $this->query($sql_query); 
    $this->virtualFields['fullname'] = 'CONCAT(Talent.firstname, " ", Talent.lastname)'; 
    return $results; 
} 

public function paginateCount($conditions = null, $recursive = 0, $extra = array()) { 
    $recursive = -1; 
    $sql_query = $this->paginateQuery; //same query as [SqlFiddle][1] 

    if(!empty($conditions)){ 
     $sql_query .= 'WHERE '; 
     foreach ($conditions as $key => $cond) { 
      $cond_str[] = $key .' '. $cond; 
     } 
     $sql_query .=implode(" AND ", $cond_str)." "; 

    } 

    $sql_query .= "GROUP BY Talent.id "; 
    $sql_query .= "ORDER BY Talent.id DESC "; 

    $this->recursive = $recursive; 
    $this->virtualFields['fullname'] = 'CONCAT(Talent.firstname, " ", Talent.lastname)'; 
    $results = $this->query($sql_query); 
    return count($results); 
} 

значение на $this->paginateQuery; это тот же запрос, как SqlFiddle

, и мне также нужно немного изменить $conditions, так как он поставляется в виде массива, поэтому мне нужно каким-то образом сконфигурировать массив до приемлемого условия.

рядом в мой контроллер, я называю что-то вроде

$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'));