سلام بچه ها تو این پست میخوام راجع به یکی از نکات لاراول صحبت کنم
تفاوت
1- $model->relation() ,
۲- $model->relation
اگه بطور خلاصه بخوایم بگیم اولی یک object از relation مورد نظر رو برمیگردونه و دومی result از relation مورد نظر برمیگردونه
حالا بریم مفصل توضیح بدیم ببینیم اینا یعنی چی:
حالت اول که توضیحش ساده است.
فرض کنید یک مدل user داریم و یک مدل post. و توی مدل user هم متد زیر رو داریم
public function posts(){
return $this->hasMany(' ');
}
وقتی مینویسیم ()user->post$ در واقع داریم همین متد رو صدا میکنیم که instance از
Illuminate\database\Eluquent\Relations\hasmany
است.
از این فانکشن زمانی استفاده میشود که بعد از آن بخواهیم query قبل از اجرا بنویسیم.
$user->posts()->where()->get();
حالت دوم :
لاراول این امکان رو میده که مستقیم به result یک relation به عنوان property دسترسی داشته باشیم.
$model->relation
که در واقع
Illuminate\Database\Eloquent\Model
هست
این property در اصل وجود ندارد و وقتی این را مینویسیم درواقع تابع get__ را صدا میزند
public function __get($key){
return $this->getAttribute($key);
}
متد getAttribute چک میکند که آیا relation لود شده ( توی relation های موجود) اگر نبود relation موجود را لود کند.
public function getAttribute($key){
if(array_key_exists($key , $this->relations)){
return $this->relations[$key];
} $CameKey=camel_case($key); if(method_exists($this , $CameKey)) { return $this->getRelationshipFromMethod($key,$camelkey) } }
در نهایت لاراول متد getResult را روی relation کال میکند و سپس متد get را روی querybuilder .
نتیجه ای مشابه زیر میدهد.
$model->relation()->get()
خلاصه ی مطلب:
1- $model->relation()
یک object از relation را برمیگرداند.
Illuminate\database\Eluquent\Relations\hasmany
2- $model->relation
یک کالکشن که result از query relation هست رو برمیگردونه.
Illuminate\database\Eluquent\Relations\collection
3- $model->relation()->get()
یک کالکشن که result از query relation هست رو برمیگردونه.
Illuminate\database\Eluquent\Relations\collection
دقیقا مثل 2
امیدوارم که این مطب بدردتون خورده باشه ?