Условия загрузки, которые ссылаются на другую таблицу - Phpactiverecord - PullRequest
3 голосов
/ 05 марта 2012

Я думаю, что у меня ограничение по phpactiverecord, но нужно уточнить:

$data = array(
    'conditions' => array(
        'still_in_contest' => 1,
         'contest_month'   => $month,
         '`genres`.`id`'   => $genre, # THIS is the issue.. and an awkward "hack" that 
                                      # I was hoping would work..
     )
     'include' => array('song' => array('artist','genre')),
     'joins'   => array('
           LEFT JOIN songs 
               ON (songs.id = contest_submissions.song_id)
               LEFT JOIN genres 
                   ON (genres.id = songs.genre_id)',
     ),

Разве нельзя просто добавить что-то вроде genres.id в запрос?

phpactiverecord устанавливает запрос как:

WHERE `contest_submissions`.`genres`.`id`=?

Если есть какой-то другой способ получить выгоду от автозагрузки с другим подобным запросом, не делая все самостоятельно?

EDIT: Моим решением сейчас было просто изменить ядро ​​класса SQLBuilder в phpactiverecord, чтобы не добавлять имя таблицы, если в ключе есть точка ...

EDIT2:

Я попробовал ваше решение, Нанн, и оно не сработало. Phpactiverecord завершает добавление имени таблицы ко всему. (

$genre = 1
    if($genre)
       $data['conditions']['genres.id'] = $genre;
     $data['conditions']['contest_submissions.still_in_contest'] = 1;
     $data['conditions']['contest_submissions.contest_month'] = $month;

Предыдущее сработало, потому что я сохранил свой хак. Неправильно ли я отформатировал условие?

EDIT3:

да .. да я неправильно отформатировал.

1 Ответ

3 голосов
/ 05 марта 2012

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

$join   = "LEFT JOIN songs ON (songs.id = contest_submissions.song_id) 
           LEFT JOIN genres ON (genres.id = songs.genre_id)";
$models = \Models\YourModel::all(array( 
                  'joins'     => $join,
                 'conditions' => array('contest_submissions.still_in_contest = ? 
                                    AND contest_submissions.contest_month = ? 
                                    AND genres.id = ?',
                                 1,
                                 $month,
                                 $genre)));

(надеюсь, я правильно понял имена таблиц и количество массивов / скобок):

...