Kontynuacja lekcji poprzednich, Eloquent, Query Builder, Builder, coraz bardziej zaawansowane wykorzystanie bazy danych. Do dzieła!

Ok, przypomnijmy sobie, że są dwa buildery, jeden dla QB (DB fasada), drugi dla Eloquent ORM:

use Illuminate\Database\Query\Builder; <--- QUERY BUILDER
use Illuminate\Database\Eloquent\Builder; <--- eloquent ORM

I oczywiście nie można zaimportować dwóch (nie pod taką samą nazwą) więc zawsze pamiętajmy, czy używamy DB czy ORMa i zawsze importujmy ten, którego potrzebujemy.

W tym przypadku odpowiedni import wygląda tak:

// use Illuminate\Database\Query\Builder;
use Illuminate\Database\Eloquent\Builder;

Znaczy – używać będziemy Eloquenta (ORMa). A po co nam ten Builder? Zobaczmy sobie.

Piszemy funkcję, która ma zwrócić John Doe albo Jane Doe. Oto komenda, zobaczmy, czy wygląda dobrze:

Artisan::command('get-doe', function () {
    $does = Person::where("firstName", "John")
    ->orWhere("firstName", "Jane")
    ->where("lastName", "Doe")
    ->select("firstName", "lastName")
    ->get();

    foreach($does as $person){
        $this->comment("{$person->firstName} {$person->lastName}");
    }
});

//Jane Doe
// John Doe
// John Fillable

Czemu tak? Cóż, z dokumentacji jakiegoś SQLa, pierwsze to to co mamy, drugie to co chcemy mieć:

SELECT *
FROM employees
WHERE    Job_Title = 'DBA'
OR
         Job_Title = 'Manager' AND Salary > 8000;

SELECT *
FROM employees
WHERE (Job_Title = 'DBA' OR Salary > 8000)
AND
       Last_name LIKE '%a%'

W naszym przypadku bierze te, gdzie imię to John, albo te, gdzie imię to Jane i nazwisko Doe. My chcemy nieco inną logikę – imię albo Jane albo John, nazwisko Doe (obowiązkowo).

Ok, tak to wygląda:

Artisan::command('get-does', function () {
    $does = Person::where(function(Builder $query){
        $query->where('firstName', 'John')
        ->orWhere('firstName', 'Jane');
    })
    ->where('lastName', 'Doe')
    ->select("firstName", "lastName")
    ->get();
    

    foreach($does as $person){
        $this->comment("{$person->firstName} {$person->lastName}");
    }
});

// Jane Doe
// John Doe

Jeżeli nie rozumiemy, to musimy debugować (metoda toSql), poczytać dokumentację, przypomnieć sobie zwykły SQL, nie jest to szczególnie trudne, choć odrobinę może przytłaczać.