Как я могу сделать sql union в торт php? - PullRequest
2 голосов
/ 15 сентября 2011

Я должен получить все ассоциативные данные для модели.В основном запрос UNION выглядит следующим образом:

  SELECT * FROM `videos` AS `U1` 
  WHERE `U1`.`level_id` = '1' AND `U1`.`submitted_date` > '2011-09-11'
UNION 
  SELECT * FROM `videos` AS `U2`
  WHERE `U2`.`level_id` = '1' AND `U2`.`submitted_date` < '2011-09-11'
  ORDER BY  submitted_date DESC
  LIMIT 0,10

Поэтому, когда я использую $this->Video->find('all')-->, я получаю все результаты связанных табличных данных.

Теперь я хочу использовать SQL-запрос UNIONи это должно возвращать связанные данные таблицы тоже ...

Есть идеи, как использовать встроенную функцию для получения данных?

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Вы можете сделать это 4 или более различными способами ... самый простой, но не рекомендуемый, использовать

$this->Model->query($query); 

, где $query - запрос, указанный выше.

Второйпуть, но может быть не тем, что вы хотите, это повторить ваш sql-запрос, вы получите тот же результат (но не разделенный псевдонимом), как это:

SELECT * FROM `videos` AS `U1` 
WHERE `U1`.`level_id` = '1' AND (`U1`.`submitted_date` > '2011-09-11' OR `U1`.`submitted_date` < '2011-09-11')
ORDER BY  submitted_date DESC
LIMIT 0,10

Этот запрос может быть легко выполнен с помощью команды find, подобной этой

$conditions = array(
    'Video.level_id'=>1,
    'OR' => array(
        'Video.submitted_date <'=> '2011-09-11',
        'Video.submitted_date >'=> '2011-09-11'
    )
);
$this->Video->find('all', array('conditions'=>$conditions)) 

Третий путь - это тот, о котором говорит Абба Брайант, подробно объясненный здесь Синтаксис объединения в cakePhp , который работает для построения оператора напрямую.

Четвертый способ понравится первому еще меньше, вам нужно будет создать поведение, которое имеет функцию beforeFind, и там вам нужно будет проверить, объединяет ли опция параметр, и создать запрос или создать что-то вроде третьего варианта.

вы будете называть это находкой, подобной этой

$this->Video->find('all', array('conditions'=>$conditions, 'union'=> $union));

Это будет что-то более менее похожее на связываемое или сдерживаемое поведение.

Пятый способ заключается в том, чтобы модифицировать ваш драйвер CakePHP SQL ... этот, я действительно не знаю, какие изменения вы должны сделать, но это способ добраться до этого ... Эти драйверыответственный за интерпретацию и создание запросов, подключение к БД и выполнение запросов ...

ПОМНИТЕ, что находка cakephp делает проверки, необходимые для предотвращения SQLInyection и других рисков ... $model->query НЕ будет этого делатьтесты, так что будьте осторожны

0 голосов
/ 15 сентября 2011

Этот вопрос здесь использует объединения и некоторый прямой доступ к источнику данных для создания запроса объединения, который можно использовать с помощью метода find.

Это немного работы, и код не будет на 100%подходит для вас - вам придется изменить его - но он должен начать вас.

Синтаксис UNION в Cakephp

...