2017-09-27 9 views
0

私は、次の雄弁のクエリを持っている:Laravel雄弁なクエリが一部の列にnullを返す

$query = Event_model::join('countries', function($q) use ($enabled_country_ids) { 
     $q->on('events.country_id', '=', 'countries.id') 
      ->whereIn('countries.id', $enabled_country_ids); 
    }) 
    ->join('leagues', function($q) use ($enabled_league_ids) { 
     $q->on('events.league_id', '=', 'leagues.id') 
      ->whereIn('leagues.id', $enabled_league_ids); 
    }) 
    ->leftJoin('event_odds AS eo1', function($q) use($win_market, $home_market_value) { 
     $q->on('events.id', '=', 'eo1.event_id') 
      ->where('eo1.market_id', '=', $win_market->id) 
      ->where('eo1.market_value_id', '=', $home_market_value->id) 
      ->where('eo1.value', '=', 'eo1.best_odd'); 
    }) 
    ->leftJoin('event_odds AS eo2', function($q) use($win_market, $draw_market_value) { 
     $q->on('events.id', '=', 'eo2.event_id') 
      ->where('eo2.market_id', '=', $win_market->id) 
      ->where('eo2.market_value_id', '=', $draw_market_value->id) 
      ->where('eo2.value', '=', 'eo2.best_odd'); 
    }) 
    ->leftJoin('event_odds AS eo3', function($q) use($win_market, $away_market_value) { 
     $q->on('events.id', '=', 'eo3.event_id') 
      ->where('eo3.market_id', '=', $win_market->id) 
      ->where('eo3.market_value_id', '=', $away_market_value->id) 
      ->where('eo3.value', '=', 'eo3.best_odd'); 
    }) 
    ->leftJoin('event_odds AS eo4', function($q) use($ou_market, $over_market_value) { 
     $q->on('events.id', '=', 'eo4.event_id') 
      ->where('eo4.market_id', '=', $ou_market->id) 
      ->where('eo4.market_value_id', '=', $over_market_value->id) 
      ->where('eo4.value', '=', 'eo4.best_odd'); 
    }) 
    ->leftJoin('event_odds AS eo5', function($q) use($ou_market, $under_market_value) { 
     $q->on('events.id', '=', 'eo5.event_id') 
      ->where('eo5.market_id', '=', $ou_market->id) 
      ->where('eo5.market_value_id', '=', $under_market_value->id) 
      ->where('eo5.value', '=', 'eo5.best_odd'); 
    }) 
    ->whereIn('events.sport_id', $enabled_sports_ids) 
    ->where('events.event_datetime', '>', time()) 
    ->select([ 
     'events.id', 
     DB::raw('FROM_UNIXTIME(events.event_datetime, "%a %D %b %H:%i") AS datetime'), 
     DB::raw('CONCAT(countries.name, " ", leagues.name, " | ", FROM_UNIXTIME(events.event_datetime, "%Y-%m-%d")) AS countryleague'), 
     DB::raw('CONCAT(events.team1_name, " vs ", events.team2_name) AS game'), 
     'eo1.value AS home',   
     'eo2.value AS draw', 
     'eo3.value AS away', 
     'eo4.value AS over', 
     'eo5.value AS under', 
     DB::raw('CONCAT("<a href=\"#\" class=\"expand-all btn\" data-id=\"", events.id, "\"><i class=\"fa fa-plus\"></i> Expand all odds</a>") AS expand'), 
     'leagues.major' 
    ]); 

これは雄弁が生成するRAW SQLクエリです:

SELECT 
    `events`.`id`, 
    FROM_UNIXTIME(
    EVENTS.event_datetime, 
    "%a %D %b %H:%i" 
) AS DATETIME, 
    CONCAT(
    countries.name, 
    " ", 
    leagues.name, 
    " | ", 
    FROM_UNIXTIME(
     EVENTS.event_datetime, 
     "%Y-%m-%d" 
    ) 
) AS countryleague, 
    CONCAT(
    EVENTS.team1_name, 
    " vs ", 
    EVENTS.team2_name 
) AS game, 
    `eo1`.`value` AS `home`, 
    `eo2`.`value` AS `draw`, 
    `eo3`.`value` AS `away`, 
    `eo4`.`value` AS `over`, 
    `eo5`.`value` AS `under`, 
    CONCAT(
    "<a href=\"#\" class=\"expand-all btn\" data-id=\"", 
    EVENTS.id, 
    "\"><i class=\"fa fa-plus\"></i> Expand all odds</a>" 
) AS expand, 
    `leagues`.`major` 
FROM 
    `events` 
INNER JOIN 
    `countries` ON `events`.`country_id` = `countries`.`id` AND `countries`.`id` IN(1,2,3,4) 
INNER JOIN 
    `leagues` ON `events`.`league_id` = `leagues`.`id` AND `leagues`.`id` IN(1,2,3,4) 
LEFT JOIN 
    `event_odds` AS `eo1` ON `events`.`id` = `eo1`.`event_id` AND `eo1`.`market_id` = 3 AND `eo1`.`market_value_id` = 51 AND `eo1`.`value` = eo1.best_odd 
LEFT JOIN 
    `event_odds` AS `eo2` ON `events`.`id` = `eo2`.`event_id` AND `eo2`.`market_id` = 3 AND `eo2`.`market_value_id` = 52 AND `eo2`.`value` = eo2.best_odd 
LEFT JOIN 
    `event_odds` AS `eo3` ON `events`.`id` = `eo3`.`event_id` AND `eo3`.`market_id` = 3 AND `eo3`.`market_value_id` = 53 AND `eo3`.`value` = eo3.best_odd 
LEFT JOIN 
    `event_odds` AS `eo4` ON `events`.`id` = `eo4`.`event_id` AND `eo4`.`market_id` = 4 AND `eo4`.`market_value_id` = 54 AND `eo4`.`value` = eo4.best_odd 
LEFT JOIN 
    `event_odds` AS `eo5` ON `events`.`id` = `eo5`.`event_id` AND `eo5`.`market_id` = 4 AND `eo5`.`market_value_id` = 55 AND `eo5`.`value` = eo5.best_odd 
WHERE 
    `events`.`sport_id` IN(1) AND `events`.`event_datetime` > 1506546556 
ORDER BY 
    `leagues`.`major` DESC, 
    `events`.`event_datetime` ASC, 
    `leagues`.`name` ASC 
LIMIT 60 OFFSET 0 

クエリが細かい実行されますが、行ごとに結果のうち、home、draw、away、over、およびunder列に対して返される値はnullです。しかし、Eloquentが実行したRaw SQLをPhpMyAdminで実行した場合、これらのフィールドはすべて値を持ちます。 Laravelが値を持つときにLaravelがnullを返すのはなぜですか?

更新(クエリして、DDの前に\ DB :: enableQueryLogを置くことによって

\ DB :: getQueryLog()私はphpMyAdminにして実行、次の生のSQLがLaravelがやったことと同じことを行いますこのクエリについて別の何かがなければならないので、それらの列にnullを返します。

SELECT 
    `events`.`id`, 
    FROM_UNIXTIME(
    EVENTS.event_datetime, 
    "%a %D %b %H:%i" 
) AS DATETIME, 
    CONCAT(
    countries.name, 
    " ", 
    leagues.name, 
    " | ", 
    FROM_UNIXTIME(
     EVENTS.event_datetime, 
     "%Y-%m-%d" 
    ) 
) AS countryleague, 
    CONCAT(
    EVENTS.team1_name, 
    " vs ", 
    EVENTS.team2_name 
) AS game, 
    CONCAT(eo1.value) AS home, 
    `eo2`.`value` AS `draw`, 
    `eo3`.`value` AS `away`, 
    `eo4`.`value` AS `over`, 
    `eo5`.`value` AS `under`, 
    CONCAT(
    "<a href=\"#\" class=\"expand-all btn\" data-id=\"", 
    EVENTS.id, 
    "\"><i class=\"fa fa-plus\"></i> Expand all odds</a>" 
) AS expand, 
    `leagues`.`major` 
FROM 
    `events` 
INNER JOIN 
    `countries` ON `events`.`country_id` = `countries`.`id` 
INNER JOIN 
    `leagues` ON `events`.`league_id` = `leagues`.`id` 
LEFT JOIN 
    `event_odds` AS `eo1` ON `events`.`id` = `eo1`.`event_id` AND `eo1`.`market_id` = 3 AND `eo1`.`market_value_id` = 51 AND `eo1`.`value` = eo1.best_odd 
LEFT JOIN 
    `event_odds` AS `eo2` ON `events`.`id` = `eo2`.`event_id` AND `eo2`.`market_id` = 3 AND `eo2`.`market_value_id` = 52 AND `eo2`.`value` = eo2.best_odd 
LEFT JOIN 
    `event_odds` AS `eo3` ON `events`.`id` = `eo3`.`event_id` AND `eo3`.`market_id` = 3 AND `eo3`.`market_value_id` = 53 AND `eo3`.`value` = eo3.best_odd 
LEFT JOIN 
    `event_odds` AS `eo4` ON `events`.`id` = `eo4`.`event_id` AND `eo4`.`market_id` = 4 AND `eo4`.`market_value_id` = 54 AND `eo4`.`value` = eo4.best_odd 
LEFT JOIN 
    `event_odds` AS `eo5` ON `events`.`id` = `eo5`.`event_id` AND `eo5`.`market_id` = 4 AND `eo5`.`market_value_id` = 55 AND `eo5`.`value` = eo5.best_odd 
WHERE 
    `events`.`sport_id` IN(1) AND `events`.`event_datetime` > 0 
ORDER BY 
    `leagues`.`major` DESC, 
    `events`.`event_datetime` ASC, 
    `leagues`.`name` ASC 
LIMIT 60 OFFSET 0 
+0

は、DB内の文 "としてx.value" あなたを入れてみてください::生 - それは違いを作るのですか? – Jason

+0

私にはいいようです。クエリーの前に '\ DB :: enableQueryLog();を入れ、' dd(\ DB :: getQueryLog()); 'を実行して、生成されたクエリーに違いがあるかどうかを確認してください。 –

+0

私は文としてx.valueでDB :: rawを使ってみましたが、違いはありませんでした。 getQueryLogの提案は面白い何かを示しています。結果セットの列は現在NULLです。したがって、クエリについては別のものが必要です。私はあなたが見ることができるようにそれを投稿します – geoffs3310

答えて

0

私はそれを割れてAaaaaah!私はWHEREではなくONの私の例

参加し
->leftJoin('event_odds AS eo1', function($q) use($win_market, $home_market_value) { 
    $q->on('events.id', '=', 'eo1.event_id') 
     ->where('eo1.market_id', '=', $win_market->id) 
     ->where('eo1.market_value_id', '=', $home_market_value->id) 
     ->where('eo1.value', '=', 'eo1.best_odd'); 
}) 
で使用していたためです

であるべき:

->leftJoin('event_odds AS eo1', function($q) use($win_market, $home_market_value) { 
    $q->on('events.id', '=', 'eo1.event_id') 
     ->where('eo1.market_id', '=', $win_market->id) 
     ->where('eo1.market_value_id', '=', $home_market_value->id) 
     ->on('eo1.value', '=', 'eo1.best_odd'); 
})