0

私は 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 ステートメントに変換することを提案してください。

4

2 に答える 2

1

クエリで何を達成しようとしているのかを判断するのは困難です。しかし、あなたが本当に欲しいのは、最近の4つの予告編に関する情報のようです。

それがそのままで、あなたはいつでもそれをすべて結合に投げることができます:

$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とサブクエリ

于 2013-01-16T05:21:52.993 に答える
1

あなたの SQL はjoinwithsub queryですが、Cake コードはjoinただです。

サブクエリを実行できますが、結合のみで実行する方法を探します。

あなたの質問には詳細が不足しているため、より良いクエリを提供することはできません。

于 2013-01-03T12:32:24.443 に答える