2017-11-16 14 views
0

dateフィールドを持つdaily_dataという名前のテーブルがあります。私はクエリビルダのインターフェイスを介して、日付の範囲内のすべての行の結果を返すことができるようにしたいと考えています(これらのケースではnull値を返します)Laravel 5 - エントリが存在しない場合でも、すべての日付のテーブルから結果を取得する方法

1つの提案は、範囲内の日付の動的リストを生成し、次にテーブルとの結合を行っているようです。これは問題を解決するためのかなり良い方法のようですが、私はLaravelでこれの例を見つけることができません。 PHPで結果をループしたり、クエリの後に空のフィールドを追加したり追加したりするのではなく、クエリビルダーから返された結果の完全なセットを得たいと思っています。

Laravel/Query Builderでこれを達成するより良い方法がある場合は、喜んでそれを聞きます。

その間、SqlFiddle:http://sqlfiddle.com/#!9/38f7db/92で日付の範囲を生成するためにこのコードが見つかりました。それはそれが主張することを行い、私はそれをLaravelで働くように適応させました。これは、基本的に以下のDB :: :: selectにすべて含まれています。私は、これは使用して動作しないことを理解することができます

[2017-11-16 01:23:16] local.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Call to a member function leftJoin() on array

$dates = DB::select(DB::raw(
     'SELECT a.Date as Date FROM 
      (SELECT "2017-11-15" - INTERVAL (a.a + (10 * b.a)) DAY AS Date 
      FROM 
      (SELECT 0 AS a 
       UNION ALL SELECT 1 
       UNION ALL SELECT 2 
       UNION ALL SELECT 3 
       UNION ALL SELECT 4 
       UNION ALL SELECT 5 
       UNION ALL SELECT 6 
       UNION ALL SELECT 7 
       UNION ALL SELECT 8 
       UNION ALL SELECT 9) AS a CROSS 
      JOIN 
      (SELECT 0 AS a 
       UNION ALL SELECT 1 
       UNION ALL SELECT 2 
       UNION ALL SELECT 3) AS b) a 
     where a.Date between "2017-11-01" and "2017-11-15"')) 
     ->leftJoin(
      'daily_data', 
      function($join) { 
       $join->on("Date", "=", "daily_data.date"); 
      } 
     ); 

私はエラーを取得する:ここでは私が探している結果を得るために参加するとそれを結合する私の試みですDB::table ...私はここでやろうとしていることを達成するための別の方法がありますか?

私は、日付を生成するクエリの部分が適切な日付のリストを返す際に機能することを確認しました。 (コードについては以下を参照してください。基本的には上記の結合と同じで、結合とそれが出力するものと同じです)。

$dates = DB::select(DB::raw(
     'SELECT a.Date as Date FROM 
      (SELECT "2017-11-15" - INTERVAL (a.a + (10 * b.a)) DAY AS Date 
      FROM 
      (SELECT 0 AS a 
       UNION ALL SELECT 1 
       UNION ALL SELECT 2 
       UNION ALL SELECT 3 
       UNION ALL SELECT 4 
       UNION ALL SELECT 5 
       UNION ALL SELECT 6 
       UNION ALL SELECT 7 
       UNION ALL SELECT 8 
       UNION ALL SELECT 9) AS a CROSS 
      JOIN 
      (SELECT 0 AS a 
       UNION ALL SELECT 1 
       UNION ALL SELECT 2 
       UNION ALL SELECT 3) AS b) a 
     where a.Date between "2017-11-01" and "2017-11-15" ')); 

と出力...(2017年11月1日と2017年11月15日の間に日付のリスト):

[0] => stdClass Object 
    (
     [Date] => 2017-11-15 
    ) 
[1] => stdClass Object 
    (
     [Date] => 2017-11-05 
    ) 
[2] => stdClass Object 
    (
     [Date] => 2017-11-14 
    ) 
... 

(私が知っているその注文していませんしかし、私はそれを修正することができると確信しています、今のところ基本的な考えを下ろそうとしています)

ありがとうございます事前に任意のポインタです。

答えて

0

あなたはleftJoin()メソッド

$dates = DB::select(DB::raw(' 
    SELECT a.Date AS DATE 
    FROM 
    (
     SELECT "2017-11-15" - INTERVAL (a.a + (10 * b.a)) DAY AS DATE 
     FROM 
     (
      SELECT 0 AS a UNION ALL 
      SELECT 1 UNION ALL 
      SELECT 2 UNION ALL 
      SELECT 3 UNION ALL 
      SELECT 4 UNION ALL 
      SELECT 5 UNION ALL 
      SELECT 6 UNION ALL 
      SELECT 7 UNION ALL 
      SELECT 8 UNION ALL 
      SELECT 9) AS a CROSS 
      JOIN 
      (
       SELECT 0 AS a UNION ALL 
       SELECT 1 UNION ALL 
       SELECT 2 UNION ALL 
       SELECT 3 
      ) AS b 
     ) a 
    LEFT JOIN daily_data c ON a.Date=c.date 
    WHERE a.Date BETWEEN "2017-11-01" AND "2017-11-15" 
    ORDER BY a.Date')); 
+0

だけで全体のもののために、生のクエリを使用してのアイデアは遠く私を得ているを使用しての代わりに、この生のクエリを試すことができます。私はいくつかの制約やものを追加する必要がありますが、これは正しい道に私を持っています、ありがとう。 – eloperdev88

関連する問題