web-dev-qa-db-ja.com

Laravelクエリビルダーの5つの複数のselect()

laravel 5.1では、

$myTable = MyTable->select('firstField');

if ($somethingTrue) {
    $myTable->select('secondField');
}

$myTable->get();

ここで、firstFieldとsecondFieldの両方を選択します。
もちろん、上記のコードは機能していません。つまり、最後にsecondFieldのみが選択されています。

クエリビルダークラスによって提供される、私が望むことを正確に実行できる関数はありますか?

15
michael

はい、addSelect()を使用できます

「選択」の下のクエリビルダのドキュメント から:

クエリビルダーインスタンスが既にあり、既存のselect句に列を追加する場合は、addSelectメソッドを使用できます。

$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();

さらに、 APIドキュメント (書かれたドキュメントとは対照的に)は、コアクラスで使用できる関数にさらに光を当てることができます。

19
Jessedc

受け入れられた回答はおそらくよりエレガントですが、select句にフィールドの配列を使用することもできます。

$fields = ['firstField'];

if ($someCondition) {
    $fields[] = 'secondField';
}

$result = DB::table('users')->select($fields)->get();
2
mwallisch

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();
1
Learner