2016-11-23 6 views
1

複数の多型親の結合を処理できるクエリを作成しようとしています。Laravel Mysql DBは2つの多型親を結合します

$this->query->join('time_records AS time', function($join) use($taskTable, $projectTable) { 
    $join->on('time.parent_id', '=', $taskTable . '.id', 'and') 
     ->on('time.parent_type', '=', Task::class, 'and') 
     ->on('time.parent_id', '=', $projectTable . '.id', 'or') 
     ->on('time.parent_type', '=', Project::class, 'and'); 
}); 

これは、列名ではなく文字列が好きではないために失敗します。しかし、私はこれがとにかくそう思わないと感じます。

これは、レポートクラス全体の一部です。この場合、多態表time_recordsが結合する必要がある2つの表があります。基本的に1つの結合である必要があります。したがって、結合されるすべての時間レコードはtimeという名前の下にあるため、使用される列は全体のクエリの構造に一致します。

ここでは、偽の階層を作成するために、多くのテーブルに参加します。私はコレクションは、グループの名前と自分のアプリケーションを読み取ることができるコレクション階層で終わるダウン、その後グループその下のプロジェクトとは、/理解することができます選択を構築する方法を多少ある

categories.name as lev1, projects.name AS lev2, tasks.name AS lev3, time.time AS time

私が探しているのは、プロジェクトまたはタスクの場合に基づいて行のデータを含むtime_recordsテーブルへの参照を持つことができる最終結果です(したがって、そのプロジェクトのlev3がnullの場合/ブランク)。私はそれが結合ではないか、それが単なる生のSQLクエリであっても気にしません。私はちょうどコレクションを十分に課税しているので、私はそれを1つのクエリに保持しながら、私が探している結果で終わるために適切な方法の周りに私の頭をラップすることはできません。

答えて

0

私は方法とそのより多くの考え方の変化を考え出しました。

あなたが望む順序でクエリを実行するのではなく、選択を調整するだけです。したがって、テーブルからデータを取得する場合は、結果のテーブルを非表示にしないで、選択引数を追加しますが、常にそれを結合します。

この部分は私の質問には表示されませんでしたが、今は分かりにくい理由を特定するのがかなり重要でした。

トップレベルから下に上がるのではなく、順番を逆にするので、クエリのメインテーブルとしてtime_recordsで開始し、それ以外のすべてを参加させると、それに関連する両方のテーブルが簡単に参加できます。

最後に答えは私が完全に間違った方法を見ていたことでした。これを見つけて手動で照会するために生のSQL出力を書き出すのに役立ちました。

関連する問題