2013-01-03 77 views
0

我正在使用cakephp 2.1并编写如下的sql语句。将sql语句转换为cakephp statment

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语句。

+0

您是在网上搜索的还是SO的?很多链接和资源......你也应该发布你的尝试。 – 2013-01-03 08:41:31

回答

1

您的SQL是join,其中sub query,而Cake代码仅为join

你可以做一个sub query,但我会寻找一种方法来完成它只有一个连接。

鉴于您的问题缺乏细节,我不能帮助更好的查询。

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