laravel 5.1では、
$myTable = MyTable->select('firstField');
if ($somethingTrue) {
$myTable->select('secondField');
}
$myTable->get();
ここで、firstFieldとsecondFieldの両方を選択します。
もちろん、上記のコードは機能していません。つまり、最後にsecondFieldのみが選択されています。
クエリビルダークラスによって提供される、私が望むことを正確に実行できる関数はありますか?
はい、addSelect()
を使用できます
クエリビルダーインスタンスが既にあり、既存のselect句に列を追加する場合は、addSelectメソッドを使用できます。
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
さらに、 APIドキュメント (書かれたドキュメントとは対照的に)は、コアクラスで使用できる関数にさらに光を当てることができます。
受け入れられた回答はおそらくよりエレガントですが、select句にフィールドの配列を使用することもできます。
$fields = ['firstField'];
if ($someCondition) {
$fields[] = 'secondField';
}
$result = DB::table('users')->select($fields)->get();
mwallischの答えは、受け入れられたものよりも優れています。なぜなら、selectを定義している場所が複数ある場合、addSelect
は機能しないからです。
たとえば、次のコードはerrorをスローします:
$myTable = MyTable->select('firstField');
if ($somethingTrue) {
$myTable->addSelect('secondField');
}
if ($somethingElseTrue) {
$myTable->addSelect('thirdField');
}
$myTable->get();
それは次のように行うことができますが:
$fields = ['firstField'];
if ($somethingTrue) {
$fields[] = 'secondField';
}
if ($somethingElseTrue) {
$fields[] = 'thirdField';
}
$result = DB::table('users')->select($fields)->get();