Мне нужно конвертировать MySQL Query в условия CakePHP - PullRequest
0 голосов
/ 13 октября 2011

У меня проблемы с пониманием того, как превратить это в собственный запрос CakePHP с помощью функции find.любая помощь будет принята с благодарностью.

SELECT * FROM `seo_web_directories` 
LEFT JOIN (SELECT * FROM `seo_site_statuses` 
  WHERE site_id = $queryData) as t1 
ON `seo_web_directories`.id = t1.web_directory_id

Переменная является динамическим значением, которое устанавливается при вызове функции

Ответы [ 3 ]

1 голос
/ 13 октября 2011

Вместо использования неоптимального ORM вы должны найти способ использовать этот запрос напрямую с моделями.Попробуйте посмотреть Model :: query () метод [источник] .

ORM (особенно те, которые реализуют ActiveRecord ), не должны использоваться дляприсоединяется.Они заканчивают тем, что делали циклы для каждой новой таблицы, которую вы добавляете к JOIN.

0 голосов
/ 11 марта 2015

Это также поможет. Введите ваш Mysql и конвертировать. Это автоматически преобразует запрос в формат cakephp, и вы можете легко это понять.

http://dogmatic69.com/sql-to-cakephp-find-converter

0 голосов
/ 14 октября 2011
$this->WebDirectory->find('all', array('conditions' => array('verified' => 0),'joins' => array(
  array(
    'table' => 'seo_site_statuses',
    'type' => 'left',
    'alias' => 't1',
    'conditions' => array('WebDirectory.id' => ' t1.web_directory_id', 't1.site_id =' . $id)))));

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

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

function paginate($id, $recursive = null, $extra = array(), $limit = 50, $page = 1){
  $page = ($page * $limit) - $limit;

  if(!empty($extra)){
    $OrderBy = "ORDER BY ";
    foreach ($extra as $key => $value) {

      $OrderBy .= $key . " " . $value;
    }
  }else{
    $OrderBy = "ORDER BY t2.page_rank DESC";
  }

  return $this->query('SELECT * FROM `seo_web_directories` as t2 
  LEFT JOIN (SELECT * FROM `seo_site_statuses` WHERE site_id = ' . $id['Site.id'] . ') as t1
  ON `t2`.id = t1.web_directory_id WHERE t2.`verified` = 0 ' . $OrderBy . ' LIMIT ' . $page . ', ' . $limit);

 // return $this->WebDirectory->find('all', compact('conditions', 'joins', 'limit', 'page', 'recursive'));
}

function paginateCount($conditions = null, $recursive = 0, $extra = array())
{
return $this->WebDirectory->find('count', array('conditions' => array('verified' => 0)));
}
...