将sql语句转换为cakephp语句

时间:2013-01-03 08:39:22

标签: sql cakephp cakephp-2.1

我正在使用cakephp 2.1并编写如下的sql语句。

SELECT * FROM industry
LEFT JOIN movie ON movie.industry_id = industry.id
LEFT JOIN (
        SELECT MAX(id) AS TID ,movie_id FROM trailer
        GROUP BY movie_id

      ) AS c ON c.movie_id = movie.id
LIMIT 0, 4;

行业是“行业”模式,电影是“电影”模型,预告片是“预告片”模型,我试过这个。

$options['joins'] = array(
        array(
            'table' => 'movies',
            'alias' => 'Movie',
            'type' => 'left',
            'conditions' => array('Industry.id = Movie.industry_id')), 
        array(
            'table' => 'movie_trailers',
            'alias' => 'Trailer',
            'type' => 'left',
            'conditions' => array('Trailer.movie_id = Movie.id')));

    $trailers = $this->Industry->find('all', $options);

所以请建议我将此语句转换为cakephp语句。

2 个答案:

答案 0 :(得分:1)

您的SQL是join sub query,而Cake代码只有join

你可以做一个sub query,但我会想办法只用连接来做这件事。

鉴于您的问题中缺少详细信息,我无法帮助您提供更好的查询。

答案 1 :(得分:1)

很难说出你想要用你的查询完成什么。但看起来你真正想要的是关于四个最新预告片的信息。

就像它一样,你总是可以把它全部扔进连接中:

$records = $this->Industry->find('all', array(
    'fields' => array('Trailer.id', 'Industry.id', 'Industry.Name', 'Movie.id', 'Movie.name'),
    'limit' => 4,
    'joins' => array(
        array(
            'table' => 'movies',
            'alias' => 'Movie',
            'type' => 'LEFT',
            'conditions' => array(
                'Movie.industry_id = Industry.id'
            ),
        ),
        array(
            'table' => '(SELECT MAX(id) As id, movie_id FROM trailers GROUP BY movie_id)',
            'alias' => 'Trailer',
            'type' => 'LEFT',
            'conditions' => array(
                'Trailer.movie_id = Movie.id'
            ),
        ),
    ),
));

由于在连接表中抛出的查询,它将破坏ORM的可移植性,但它可以工作。

以下是另一个可能有用的问题:CakePHP and subquery