mkeremcansev Bir modeli Sushi yaptığınızda model connection olarak sqlite kullanıyor. Veri olarak da içine tanımladığınız protected $rows[] dizisini kullanıyor. Bu sayede gerçek bir tablo kullanmadan Eloquent özelliklerini kullanabiliyorsunuz. Tabi her şeyi desteklemiyor, örneğin whereHas ama destekledikleri bile yeterli.
class State extends Model
{
use \Sushi\Sushi;
protected $rows = [
[
'abbr' => 'NY',
'name' => 'New York',
],
[
'abbr' => 'CA',
'name' => 'California',
],
];
}
$state = State::findOrFail(1); // NY
$states = State::all();
$states = State::where('name', 'like', "%{$search}%")->get();
$states = State::orderBy('abbr')
->get()
->map(fn($state) => $state->abbr + ':' + $state->name)
->toArray();
/*
[
'CA:California',
'NY:New York',
]
*/
// vs ...
Bu ve bunun gibi ENUM dediğimiz yapılar için kullanabilirsiniz. OrderStatus, UserType, Role... gibi modeller için mesela. Örneğin ben şu şekilde kullanıyorum:
class TaskStatus extends Model
{
use \Sushi\Sushi;
const DRAFT = 'draft';
const ASSIGNED = 'assigned';
const IN_PROGRESS = 'in_progress';
const COMPLETED = 'completed';
const FAILED = 'failed';
protected $primaryKey = 'slug';
protected $keyType = 'string';
public $incrementing = false;
protected $rows = [
['slug' => self::DRAFT, 'name' => 'Taslak'],
['slug' => self::ASSIGNED, 'name' => 'Atandı'],
['slug' => self::IN_PROGRESS, 'name' => 'Yapılıyor'],
['slug' => self::COMPLETED, 'name' => 'Tamamlandı'],
['slug' => self::FAILED, 'name' => 'Başarısız'],
];
}
Artık:
public function __invoke()
{
$taskStatuses = TaskStatus::all();
return TaskStatus::collection($taskStatuses);
}
if($task->status_slug == TaskStatus::COMPLETED) {
// ...
}
public function status(): BelongsTo
{
return $this->belongsTo(TaskStatus::class, 'status_slug');
}
$task->status->name; // Tamamlandı
Mantıklı değil ama neler yapılabileceğine örnek göstermek adına;
$completed = TaskStatus::find(TaskStatus::COMPLETED);
if($task->status->is($completed)) {
// ...
}