Poznajemy jeszcze więcej języka SQL, którego dobra znajomość jest nam potrzebna. Do dzieła.

Ok, zmodyfikujmy people (w testowej bazie danych, nie projekcie Laravelowym), dodajmy enum:

ALTER TABLE `people` 
ADD COLUMN 
gender ENUM('Male','Female');

W Laravelu enumy dodajemy w ten sposób:

$table->enum('difficulty', ['easy', 'hard']);

Ok, zróbmy prosty select:

SELECT id, name, age, cash, gender
FROM `people`;

Jak widać domyślnie dostaliśmy gender jako null. Dobra, poznajmy funkcję ifnull:

SELECT id, name, age, cash, 
ifnull(gender, "unknown")
FROM `people`;

Pięknie, zamiast null mamy unknown, tylko nazwa kolumny zepsuta. To już naprawić powinniśmy umieć:

SELECT id, name, age, cash, 
ifnull(gender, "unknown") as gender 
FROM `people`; 

Ok, poznajmy teraz funkcję nullif:

SELECT id, name, age, 
nullif(cash, 0) as cash, 
ifnull(gender, "unknown") as gender 
FROM `people`; 

Tam, gdzie kasa wynosiła 0 teraz mamy null. Do czego to się może przydać? Połączmy wiedzę:

SELECT id, name, age, 
ifnull(nullif(cash, 0), "no cash") as cash, 
ifnull(gender, "unknown") as gender 
FROM `people`; 

Zamiast ifnull możemy używać funkcji COALESCE:

SELECT id, name, age, 
COALESCE(nullif(cash, 0), "no cash") as cash, 
COALESCE(gender, "unknown") as gender
FROM `people`; 

Mamy też funkcję IF:

SELECT id, name, age, 
IF(age>17, "YES", "NO") as adult,
COALESCE(nullif(cash, 0), "no cash") as cash, 
COALESCE(gender, "unknown") as gender
FROM `people`; 

W SQL Server ta funkcja nazywa się IIF, ale my korzystamy z MySQLa.

W Laravelu bardzo często używamy tych bardziej zaawansowanych funkcji z DB::raw (jakiś przykład z internetu):

->select(
    'd.dept_name',
     DB::raw('COALESCE(CONCAT(hod.first_name, " ", hod.last_name), "Not Specified") AS hod_name'),
)
->get();

Oczywiście są artykuły jak to obejść, ale nie będziemy tego omawiać na razie, minimalnie musimy się podszkolić w Laravelu i bazach danych aby tak się bawić, więc jakby co – DB::raw daje radę.

Ach, CONCAT. Załóżmy, że nasza tabela ma firstName i lastName (jak nasza people, ale w bazie Laravelowej):

SELECT id, 
CONCAT(firstName, " ", lastName) as "name" 
FROM `people`; 

Oczywiście to są świetne funkcje, warto je znać i być jak najlepszym w SQL (choć te akurat to piaskownica), ale w Laravelu nie wszystko musi być robione na poziomie bazy danych.

Przypomnijmy sobie $person->full_name:

use Illuminate\Database\Eloquent\Casts\Attribute;

class Person extends Model
{
    protected $fillable = ['firstName', 'lastName', 'age'];
    
    use HasFactory;

    protected function fullName(): Attribute
    {
        return Attribute::make(
            get: fn () => $this->firstName . " " . $this->lastName,
        );
    }

   //(...)
}

Jak zbyt skomplikowane, to przypomnijmy sobie $person->fullname():

class Person extends Model
{
    protected $fillable = ['firstName', 'lastName', 'age'];
    
    use HasFactory;

    public function fullname(){
        return $this->firstName . " " . $this->lastName;
     }
    
   //(...)
}