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;
}
//(...)
}