2013-06-05 24 views
6

Korzystając z konstruktora zapytań laravel/fluent, próbuję spowodować, aby stała wartość pola przechodziła przez selekcję union (ed), która jest następnie sortowana. Nie znalazłem przepisu na płynne wykonywanie następujących czynności. Związki są łatwe, ale jak sprawić, by praca w terenie była stała?przy użyciu konstruktora zapytań laravel

Wyobraźmy sobie dwa proste stoły (pominięty) i unii Wybierz:

select field1, field2, 'type1' as field3 from table1 
UNION 
select field1, field2, 'type2' as field3 from table2 
ORDER BY field2 

Najlepszą odpowiedzią Mam wymyślić do tej pory, jest użycie DB :: kwerendy z ciągu kwerendy I produkować sama . Laravel/fluent nie wydaje się być gotowy, by poradzić sobie z tą sprawą, biorąc pod uwagę przypadki testowe, które próbowałem. Używanie RAW dla zaznaczenia działa świetnie, dopóki nie spróbujesz zamówić pary wybranych zapytań do tabeli.

SELECT field1, field2 FROM 
(
    SELECT fld1A as field1, 'FOO' as field2 from table1 
    UNION ALL 
    SELECT fld2A as field1, 'BAR' as field2 from table2 
) 
temp_table order by somefield 
+0

Można również użyć sprawa: http://stackoverflow.com/questions/3389713/how-does-mysql-case- praca – Hackerman

Odpowiedz

3

ten sposób, prawdopodobnie:

$users = DB::table('users') 
      ->select(DB::raw("'FOO' as field2")) 
      ->get(); 
7

Korzystanie laravel 4, a przy użyciu GROUP BY, zamiast ORDER BY Wierzę, że można zrobić coś takiego:

$t1 = DB::table('table1') 
    ->select('field1',DB::raw("'FOO' as field2")) 
    ->groupBy('field2'); 
$t2 = DB::table('table2') 
    ->select('field1',DB::raw("'BAR' as field2")) 
    ->groupBy('field2'); 
$result = $t1->union($t2)->get(); 

Okazało się, że $t1 w tym przypadku może być instancją Illuminate\Database\Query\Builder lub Illuminate\Database\Eloquent\Builder, ale argument zbiorowy ($t2) musi być typu Illuminate\Database\Query\Builder .

To oznacza, że ​​można użyć chętny załadunek z czymś takim:

$t1 = MyTableModel::with('table3')->select...

Powiązane problemy