2016-11-21 3 views
1

Я пытаюсь сделать союз, например:союз с использованием СО в Laravel/Lumen

$first = Content::selectRaw("id, title, channel_id, description") 
->with('trailer') 
->where('description', 'asdadadadaid'); 

$second = OtherTypeOfContent::selectRaw("id, title, channel_id, description") 
->with('trailer') 
->where('description', 'asdadadadaid'); 

$data = $first->union($second)->get(); 

Для Содержания, прицеп связан к столу contents_trailers. Для OtherTypeOfContent трейлер связан с таблицей othertypeofcontent_trailers.

Когда я пытаюсь сделать объединение между этими двумя запросами, всегда получаю значения content_trailers для with -> ('trailer'), также для результатов второго запроса. Кажется, что отношения берутся только с первого запроса.

Как я могу это решить? Спасибо!

+0

Когда я когда-либо работать со сложными запросами SQL в красноречивых, которые дают результаты которые мне кажутся неправильными, я считаю полезным использовать метод Builder :: toSql() для получения SQL, который Eloquent намеревается запустить, поэтому я могу попробовать и отладить его. В вашем случае попробуйте вывести '$ first-> union ($ second) -> toSql();' и посмотреть, совпадает ли возвращаемый SQL с вашим ожиданием. Кроме того, вы можете добавить вывод к своему вопросу для большего контекста. – stratedge

+0

Привет, xjstratedgebx! Конечно, я тестировал это, но часть с -> ('xxxx') никогда не печатается в выводе -> toSql() в любом запросе. Попробуй, и ты это увидишь. –

+0

Хммм, так что вы не видите никаких объединений в полном запросе? Какими отношениями занимается трейлер? Можете ли вы опубликовать результирующий запрос и ваши настройки модели (за исключением каких-либо конфиденциальных данных, конечно)? – stratedge

ответ

1

Я думаю, проблема в том, что Eloquent не запускает никаких прилагаемых инструкций с основным запросом, а вместо этого выбирает требуемые строки, а затем запускает запрос для каждой инструкции with() для получения любых необходимых данных. Это объясняет, почему вызов toSQL() в построителе запросов с инструкциями with() не возвращает никаких соединений - он не будет запускать их в этом запросе.

Так что, пока я боюсь, что для вашего объединения не будет with(), вы можете вручную создать соединения в свой запрос. Это то, что я делал в прошлом с профсоюзами, и именно поэтому я подумал, что toSql() вернет соединения.

Вот пример объединения с соединениями, которые я использую в одном из своих платформ на некоторое время, и это хорошо работает:

<?php 

namespace App\Models; 

use DB; 
use Illuminate\Database\Eloquent\Model; 

class Example extends Model 
{ 
    /** 
    * Unions the query contained within with the query returned from 
    * buildGloballyScopedCampaignsQuery 
    */ 
    public static function findScopedToChannelId($channel_id) 
    { 
     $first = static::buildGloballyScopedCampaignsQuery(); 

     return static::select('ac.*') 
      ->from('ad_campaigns AS ac') 
      ->join('ad_campaign_scopes AS acs', function ($join) use ($channel_id) { 
       $join->on('ac.id', '=', 'acs.campaign_id') 
        ->where('acs.channel_id', '=', $channel_id); 
      }) 
      ->where(function ($query) { 
       $query->whereNull('ac.start_date') 
        ->orWhere('ac.start_date', '<', DB::raw('NOW()')); 
      }) 
      ->where(function ($query) { 
       $query->whereNull('ac.end_date') 
        ->orWhere('ac.end_date', '>', DB::raw('NOW()')); 
      }) 
      ->union($first) 
      ->orderBy('rank', 'DESC') 
      ->get(); 
    } 

    public static function buildGloballyScopedCampaignsQuery() 
    { 
     return static::select('ac.*') 
      ->from('ad_campaigns AS ac') 
      ->leftJoin('ad_campaign_scopes AS acs', 'ac.id', '=', 'acs.campaign_id') 
      ->whereNull('acs.id') 
      ->where(function ($query) { 
       $query->whereNull('ac.start_date') 
        ->orWhere('ac.start_date', '<', DB::raw('NOW()')); 
      }) 
      ->where(function ($query) { 
       $query->whereNull('ac.end_date') 
        ->orWhere('ac.end_date', '>', DB::raw('NOW()')); 
      }); 
    } 
} 
+0

Хм, так ... Я думаю, что Eloquent действительно ограничен. –

+0

Да, это очень хорошая работа, когда вы занимаетесь ситуациями, которые вы собираетесь потратить большую часть своего времени, и сделать их в целом довольно легкими и прямыми. Пойдем немного из коробки, хотя, и все может стать синтаксически довольно уродливым довольно быстро. – stratedge

Смежные вопросы