لنفرض أن لدينا الـ 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
الخاصية visible:
وهنا يتم تحديد الحقول التي نريد عرضها، وللقيام بذلك نذهب إلى 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'];
الخاصية hidden
هنا يتم تحديد الحقول التي نريد إخفاؤها، حيث نذهب إلى 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 عادي أن لا يتم عرضها?
الدالة makeVisible
نقوم بتحديد الخاصية 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
الدالة makeHidden
هي عكس 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"
},Query Optimization عند إستخدام Visible, Hidden, makeVisible, makeHidden
هنا يجب الإنتباه إلى أن 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"
},الدوال setVisible و SetHidden
في 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
- الدوال setHidden و setVisible تعتبر مفيده عندما نريد إخفاء أو إظهار بعض الحقول بشكل مباشر من جملة eloquent دون أن يتم تحديد ذلك في الخواص hidden, visible في الـ model.
- visible, hidden يتم إستخدامها كخواص في الموديل بينما setVisible, setHidden, makeVisible, makeHidden هما دوال يتم إستخدامهما مع جملة eloquent.
التعليقات (0)
لا توجد تعليقات بعد — كن أول من يشارك رأيه.
أضف تعليقك