15

使用 laravel/fluent 查询生成器,我试图为随后排序的 union(ed) 选择传递一个常量字段值。我还没有找到用流利的方式完成以下操作的方法。工会很容易,但是如何让字段常量起作用?

想象一下两个简单的表(省略)和一个联合选择:

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

到目前为止,我想出的最佳答案是将 DB::query 与我自己制造的查询字符串一起使用。鉴于我尝试过的测试用例,Laravel/fluent 似乎还没有准备好处理这种情况。使用 RAW 进行选择非常有效,直到您尝试订购一对选定的表查询。

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
4

2 回答 2

20

使用 Laravel 4,并使用 GROUP BY,而不是 ORDER BY 我相信您可以执行以下操作:

$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();

我发现$t1在这种情况下可以是Illuminate\Database\Query\Builderor的实例Illuminate\Database\Eloquent\Builder,但联合参数 ( $t2) 必须是类型Illuminate\Database\Query\Builder

这意味着您可以通过以下方式使用急切加载:

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

于 2013-08-02T13:05:59.293 回答
10

这样,大概:

$users = DB::table('users')
            ->select(DB::raw("'FOO' as field2"))
            ->get();
于 2013-06-06T00:50:43.440 回答