لارافيل, Model / 2024-05-13

الخواص , makeVisible, makeHidden, setVisible, setHidden ,visible, hidden في لارافيل

الخواص , makeVisible, makeHidden, setVisible, setHidden ,visible, hidden في لارافيل

2024-05-13 وقت القراءه : 3 دقائق

لنفرض أن لدينا الـ 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

  1. الدوال setHidden و setVisible تعتبر مفيده عندما نريد إخفاء أو إظهار بعض الحقول بشكل مباشر من جملة eloquent دون أن يتم تحديد ذلك في الخواص hidden, visible في الـ model.
  2. visible, hidden يتم إستخدامها كخواص في الموديل بينما setVisible, setHidden, makeVisible, makeHidden هما دوال يتم إستخدامهما مع جملة eloquent.
إضافة تعليق
Loading...