لنفرض أن لدينا الـ Post model ونريد إرجاع جميع السجلات
public function index() { $posts=Post::get(); return $posts; }
ولنفرض إنه سيتم إرجاع البيانات التالية
{ "id": 8, "title": "Land of Sad Oranges", "likes": 137, "dislikes": 63, "created_at": "2023-02-06T13:02:09.000000Z", "updated_at": "2023-02-06T13:02:09.000000Z" }, { "id": 9, "title": "Death of Bed Number 12", "likes": 298, "dislikes": 59, "created_at": "2023-02-06T13:02:09.000000Z", "updated_at": "2023-02-06T13:02:09.000000Z" },
السؤال : ماذا لو إردنا من جملة eloquent بالأعلى نريد أن يتم إرجاع فقط title؟
هنا يمكن لنا إستخدام الخاصتين visible و hidden
وهنا يتم تحديد الحقول التي نريد عرضها، وللقيام بذلك نذهب إلى Post Model ونقوم بإستخدام الخاصية ومن ثم تحديد الحقول التي نريد عرضها وفي حالتنا فإننا نريد فقط title
class Post extends Model { protected $visible = ['title']; }
الأن لو قمنا بتنفيذ جملة eloquent التي بالأعلى ـ فإننا سوف نحصل على النتيجة التالية:
{ "title": "Land of Sad Oranges" }, { "title": "Death of Bed Number 12" },
بالطبع يمكن تحديد أكثر من حقل كي يتم عرضه
protected $visible = ['title','likes'];
هنا يتم تحديد الحقول التي نريد إخفاؤها، حيث نذهب إلى Post Model وبإستخدام الخاصية hidden نقوم بتمرير الحقول التي لا نريد أن يتم عرضها
protected $hidden = ['id','created_at','updated_at','likes','dislikes'];
الأن عند عرض البيانات سوف نحصل على نفس النتيجة التي حصلنا عليها من الخاصية visible
{ "title": "Land of Sad Oranges" }, { "title": "Death of Bed Number 12" },
السؤال الأهم ، ماذا لو كان لدينا نظام تسجيل دخول ونريد إذا كانت role='admin' أن يتم عرض dislike أما إذا كان user عادي أن لا يتم عرضها?
نقوم بتحديد الخاصية visible في الـ Post Model
class Post extends Model { protected $visible = ['title']; }
ومن ثم في جملة eloquent نستخدم makeVisible إذا كان نوع المستخدم admin
public function index() { $posts=Post::get(); $role='admin'; $posts->makeVisible($role=='admin' ? ['dislikes'] : []); return $posts; }
بالتالي سوف نحصل على النتائج التالية
{ "title": "Land of Sad Oranges", "dislikes": 63 }, { "title": "Death of Bed Number 12", "dislikes": 59 },
كما نلاحظ أنه تم عرض sislikes بالرغم من أنه لم يتم تحديدها في الخاصية visible بالموديل، لكن تم إستخدام setVisible في جملة eloquent
هي عكس makeVisible حيث نحدد الحقول التي لا نريد أن يتم إرجاعها، مثلا إذا كان نوع المستخدم user أن لا يتم إرجاع likes, dislikes
public function index() { $posts=Post::get(); $role='user'; $posts->makeHidden($role=='user' ? ['dislikes','likes'] : []); return $posts; }
بالتالي نحصل على النتائج التالية
{ "id": 8, "title": "Land of Sad Oranges", "created_at": "2023-02-06T13:02:09.000000Z", "updated_at": "2023-02-06T13:02:09.000000Z" }, { "id": 9, "title": "Death of Bed Number 12", "created_at": "2023-02-06T13:02:09.000000Z", "updated_at": "2023-02-06T13:02:09.000000Z" },
هنا يجب الإنتباه إلى أن visible, hidden, makeVisible, makeHidden يتم تنفيذها بعد أن يتم عمل fetch للـ model أي بعد تنفيذ جملة الإستعلام، وهنا نحصل على بيانات لا نريد إستخدامها، ولعمل optimization لجملة الـ eloquent وإرجاع فقط البيانات التي نريدها
public function index() { $role='user'; $selectOnly = $role == 'admin' ? ['*'] : ['title']; $posts=Post::select($selectOnly)->get(); return $posts; }
بالتالي سوف نحصل على البيانات التالية، مع جلب الحقول التي نحتاجها فقط
{ "title": "Land of Sad Oranges" }, { "title": "Death of Bed Number 12" },
في laravel 9.47 تم إضافه الخاصتين setVisible و setHidden
public function index() { $posts=Post::get(); $posts->setHidden(['likes','dislikes']); return $posts; }
public function index() { $posts=Post::get(); $posts->setVisible(['id','title']); return $posts; }
الفرق بين makeHidden, makeVisible و setHidden, setVisible