Kaan
$homeImage = $this->project->contentImages->where('home_image', 1)->first();
with içerisinde where şartı koysanız ile kurduğunuz ilişki one-to-many ya da many-to-many olduğu için kayıt her zaman çoğul döner. O yüzden first() ile ilk gelen kaydı alırsınız. Bunun için bir yöntem yazabilirsiniz:
public function homeImage()
{
return $this->contentImages->where('home_image', 1)->first(null, new ContentImage);
}
with ile eager loading yaptığınızda bu yöntem de ondan faydalanacaktır. $project->homeImage()
şeklinde kullanırsınız. first(null, new ContentImage);
kısmı ise Builder içindeki withDefault özelliğini emule etmek için.
İleri düzey bir şey isterseniz, eğer hasMany (one-to-many yani) kullandıysanız hasMany ilişkisini hasOne ilişkisine çevirmektir:
public function contentImages(): HasMany
{
return $this->hasMany(ContentImage::class);
}
public function homeImage(): HasOne
{
$builder = $this->contentImages()->where('home_image', 1);
$relation = new HasOne($builder->getQuery(), $this, 'project_id', 'id');
return $relation->withDefault();
}
Bunun avantajı homeImage Builder döner ve withDefault sayesinde homeImage yoksa bile var mı yok mu kontrolü yapmadan işlem yapabilirsiniz:
$homeImage = $this->project->homeImage;
// $homeImage yoksa bile burada trying to get property of non-object hatası almazsınız:
return $homeImage->image;