ترفند های لاراول Eloquent قسمت اول

حمید تیموری 1716 بازدید 1397/07/27
ترفند های لاراول Eloquent قسمت اول

خوشحالم که میتونم در زمینه آموزش لاراول به افرادی که به این فریمورک علاقه دارند کمک کنم.
افرادی که با الوکوئنت کار مرده باشن بهتره این مطل رو بخونن حتما !


توابع بسیار زیادی در الوکوئنت وجود دارند که کمتر دیده شده اند ولی میتوانند به شما کمک کنند خروجی بهتری بگیرید:

1. Increments and Decrements
به جای این:

$article = Article::find($article_id);
$article->read_count++;
$article->save();

میتوانید از این تابع استفاده کنید:

$article = Article::find($article_id);
$article->increment('read_count');

و همچنین به صورت زیر نیز میتوانید از آن استفاده کنید:

Article::find($article_id)->increment('read_count');
Article::find($article_id)->increment('read_count', 10); // +10
Product::find($produce_id)->decrement('stock'); // -1

این تابع به صورت پیشفرض یک واحد به ستونی که مد نظر شماست اضافه میکند. ولی طبق مثال اگر پارامتر دوم را یک عدد درنظر بگیرید، ستون مورد نظر را به اضافه آن عدد خواهد کرد!

2. توابع XorY
لاراول الکونت داری توابعی است که ترکیبی از 2 عمل است به صورت که : "لطفا X را انجام بده، در غیر این صورت Y را انجام بده"

مثال 1: firstOrFail
به جای کد زیر:

$user = User::find($id);
if (!$user) { abort (404); }

کد زیر را استفاده کنید:

 $user = User::findOrFail($id);

مثال 2: firstOrCreate
به جای :

$user = User::where('email', $email)->first();
if (!$user) {
  User::create([
    'email' => $email
  ]);
}

از تابع زیر استفاده کنید:

$user = User::firstOrCreate(['email' => $email]);

3. تابع boot مدل
توابعی به اسم boot در مدل وجود دارد که شما میتوانید موارد پیشفرض را در مدل تغییر دهید:

class User extends Model
{
    public static function boot()
    {
        parent::boot();
        static::updating(function($model)
        {
            // do some logging
            // override some property like $model->something = transform($something);
        });
    }
}

یکی از محبوب ترین مثال هایی که میتوان در این قسمت استفاده کرد، ایجاد یک ID خاص برای هر object است زمانی که ساخته میشود. با استفاده از این پکیج میتوان این کار انجام داد:

public static function boot()
{
  parent::boot();
  self::creating(function ($model) {
    $model->uuid = (string)Uuid::generate();
  });
}

4. روابط همراه با شرط و مرتب سازی
کد زیر یک روش معمول برای ایجاد یک رابطه است:

public function users() {
    return $this->hasMany('App\User');    
}

حالا فکر کنید میخواهید افرادی را که تایید شده اند بگیرید و آنها را بر اساس ایمیل مرتب کنید:

public function approvedUsers() {
    return $this->hasMany('App\User')->where('approved', 1)->orderBy('email');
}

5. Model properties: timestamps, appends etc
مغیر و property هایی وجود دارد که شما با استفاده از آنها میتوانید تنظیمات مدل خود را تغییر دهید.

class User extends Model {
    protected $table = 'users';
    protected $fillable = ['email', 'password']; // which fields can be filled with User::create()
    protected $dates = ['created_at', 'deleted_at']; // which fields will be Carbon-ized
    protected $appends = ['field1', 'field2']; // additional values returned in JSON
    protected $primaryKey = 'uuid'; // it doesn't have to be "id"
    public $incrementing = false; // and it doesn't even have to be auto-incrementing!
    protected $perPage = 25; // Yes, you can override pagination count PER MODEL (default 15)
    const CREATED_AT = 'created_at';
    const UPDATED_AT = 'updated_at'; // Yes, even those names can be overridden
    public $timestamps = false; // or even not used at all

}

موارد دیگری هم وجود دارد که میتوانید از این لینک آنها را مشاهده کنید.

6. یافتن چندین رکورد
با تابع زیر آشنایی دارید

$user = User::find(1);

این تابع میتواند آرایه ای از ID ها را نیز بپذیرد:

$users = User::find([1,2,3]);


7. WhereX
اجرای شرط در الوکوئنت به صورت زیر است:

$users = User::where('approved', 1)->get();

اما راه دیگری هم وجود دارد:

$users = User::whereApproved(1)->get(); 

شما میتوانید نام هر فیلد از جدول را به همین صورت استفاده کنید.
همچنین چند تابع از قبل تعریف شده برای کار با زمان وجود دارد که به صورت زیر است:

User::whereDate('created_at', date('Y-m-d'));
User::whereDay('created_at', date('d'));
User::whereMonth('created_at', date('m'));
User::whereYear('created_at', date('Y'));

 
8. مرتب کردن بر اساس رابطه
در مثالی برای انجمن و پست ها، ابتدا یک رابطه برای پست های اخیر تعریف میکنیم:

public function latestPost()
{
    return $this->hasOne(\App\Post::class)->latest();
}

و سپس در کنترلر ما میتوانیم به شکل زیر عمل کنیم:

$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');

کد بالا به این معنی است که رکوردهای مدل Topic را گرفته و آنها را بر اساس تاریخ ایجاد پست هایشان مرتب میکند.

9. Eloquent::when() – no more if-else’s
بسیاری از جملات شرطی به شکل زیر است:

if (request('filter_by') == 'likes') {
    $query->where('likes', '>', request('likes_amount', 0));
}
if (request('filter_by') == 'date') {
    $query->orderBy('created_at', request('ordering_rule', 'desc'));
}

اما یک راه بهتر وجود دارد:

$query = Author::query();
$query->when(request('filter_by') == 'likes', function ($q) {
    return $q->where('likes', '>', request('likes_amount', 0));
});
$query->when(request('filter_by') == 'date', function ($q) {
    return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});

ممکن است که این روش کوتاه تر و یا حتی زیبا تر نباشد! اما در انتقال متغیر ها به توابع قدرتمند تر است:

$query = User::query();
$query->when(request('role', false), function ($q, $role) { 
    return $q->where('role_id', $role);
});
$authors = $query->get();

10. BelongsTo Default Models
فرض کنید مدل پست شما متعلق به یک نویسنده است پس در blade میتوانید نویسنده هر پست را به شکل زیر چاپ کنید:

{{ $post->author->name }}

حالا اگر به هردلیلی نویسنده حذف شده باشد ممکن است  با این خطا مواجه شوید: "property of non-object"
البته شما میتوانید با این کد از بروز این خطا جلوگیری کنید

{{ $post->author->name ?? '' }}
// or
{{ $post->author->name or '' }}

ولی شما میتوانید هنگام تعریف relationship ، از بروز همیچین خطایی جلوگیری کنید

public function author()
{
    return $this->belongsTo('App\Author')->withDefault();
}

در این مثال، رابطه author اگر، نویسنده ای برای پست پیدا نکند، یک مقدار خالی را برمیگرداند.
علاوه بر این ما میتوانیم یک مقدار دلخواه را برای پیشفرض درنظر بگیریم:

public function author()
{
    return $this->belongsTo(App\Author::class)->withDefault([
        'name' => 'Guest Author'
    ]);
}

امیدوارم این مطلب در آموزش لاراول به شما کمک کرده باشد.

ادامه مطلب به زودی...

دیگر مقالات
امید کیانی 1459 بازدید 1398/06/17
امید کیانی 2808 بازدید 1398/07/20
امید کیانی 929 بازدید 1398/05/14
حمید تیموری 1494 بازدید 1397/05/20
امید کیانی 1008 بازدید 1398/03/03


نظرات (0)
هنوز نظری ثبت نشده است
برای ثبت نظر ابتدا وارد سایت شوید