برنامه نویسی

هنر مدل های Laravel – بیشترین استفاده را از آنها کسب کنید

اگر تا به حال با پایگاه داده در لاراول کار کرده اید ، احتمالاً با مدلهای فصیح روبرو شده اید. آنها ستون فقرات لاراول هستند القاء(نقشه برداری شیء) ، سیستم ، ساخت تعامل پایگاه داده صاف و بصری. به مدل ها به عنوان واسطه بین جداول پایگاه داده و کد PHP خود فکر کنید – نیازی نیست هر بار که به برخی از داده ها نیاز دارید ، نمایش داده های SQL را به صورت دستی بنویسید! 🤩

با مدل های Laravel ، می توانید با سوابق پایگاه داده با استفاده از نحو PHP ساده و بیانگر کار کنید. و بهترین قسمت؟ آنها با ویژگی های داخلی مانند روابط ، دسترسی ها ، جهشگرانوت دامنه های پرس و جو تا زندگی خود را آسان تر کنید. بیایید آن را بشکنیم!

اولی

درک اصول مدلهای لاراول

هر مدل در Laravel کلاس Illuminate \ Database \ فصاحت \ مدل را گسترش می دهد ، که به آن ابرقدرت ها می دهد. در اینجا یک مدل اساسی به نظر می رسد:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $fillable = ['name', 'email', 'password'];
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

یک مدل یک جدول در پایگاه داده شما را نشان می دهد. اگر از کنوانسیون های Laravel پیروی کنید ، کاربر مدل به طور خودکار در جدول کاربران نقشه می کند. اما اگر نام جدول شما مطابقت ندارد ، می توانید آن را به صورت دستی تعریف کنید:

class Product extends Model
{
    protected $table="my_products";
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ساده ، درست است؟ حال بیایید به بهترین روشها برای کارآمد بودن مدل ها شیرجه بزنیم.

دوم

چگونه می توان مدل ها را به طور کارآمد کنترل کرد؟

قبل از غواصی در پروژه Laravel ، لحظه ای را تنظیم کنید تا مدل های خود را به درستی تنظیم کنید. یک مدل خوب ساختار یافته ، کد تمیزتر و عملکرد بهتر را تضمین می کند.

از آسیب پذیری های واگذاری انبوه جلوگیری کنید

آیا تا به حال از تکالیف انبوه شنیده اید؟ این اتفاق می افتد که کاربران بخش بزرگی از داده ها را برای ذخیره ارسال می کنند – بدون هرگونه محدودیتی که می توان در آن قسمت ها به روز شد. لاراول با استفاده از ویژگی های پر و محافظت شده ، شما را از این امر محافظت می کند.

با استفاده از Fillable (رویکرد Allowlist)

این به صراحت مشخص می کند که کدام قسمت ها می توانند به صورت انبوه تنظیم شوند:

class User extends Model
{
    protected $fillable = ['name', 'email', 'password'];
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اکنون ، فقط زمینه های مشخص شده می توانند به صورت انبوه تنظیم شوند:

User::create(['name' => 'John Doe', 'email' => 'john@example.com', 'password' => 'secret']);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

با استفاده از محافظت شده (رویکرد بلوک)

اگر ترجیح می دهید فقط از چند زمینه محافظت کنید ، دوست شما محافظت می شود:

class User extends Model
{
    protected $guarded = ['role'];
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اکنون ، همه زمینه ها به جز نقش می توانند به صورت دسته جمعی باشند.

💡 از کدام یک باید استفاده کنید؟

  • برای امنیت بهتر از Fillable استفاده کنید زیرا از یک رویکرد Allowlist پیروی می کند
  • از نگهبان استفاده کنید = [] اگر می خواهید به طور پیش فرض به همه ویژگی ها اجازه دهید و فقط از موارد خاص محافظت کنید

روابط را به درستی تعریف کنید

روابط فصیح به شما کمک می کند تا نمایش داده ها را به طور کارآمد ساختار دهید.

یک به یک (هانسون)

یک کاربر یک پروفایل دارد:

class User extends Model
{
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

واکشی نمایه:

$user = User::find(1);
$profile = $user->profile;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

یک به بسیاری (Hasmany)

کاربر می تواند چندین پست داشته باشد:

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

بازیابی پست ها:

$posts = User::find(1)->posts;
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

برای اطلاعات دقیق ، اسناد مربوط به روابط را بررسی کنید.

سوم

برای پرس و جوهای قابل استفاده مجدد از Scopes Query استفاده کنید

آیا شما همچنان همان شرایط پرس و جو را تکرار می کنید؟ Scopes Query به شما امکان می دهد فیلترهای مشترک را در داخل خود مدل تعریف کنید.

دامنه جهانی (در مورد همه نمایش داده شد)

class User extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('active', function ($query) {
            $query->where('status', 'active');
        });
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اکنون ، کاربر :: همه () فقط کاربران فعال را واگذار می کند.

دامنه محلی (در صورت تقاضا اعمال می شود)

class User extends Model
{
    public function scopeActive($query)
    {
        return $query->where('status', 'active');
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

چهارم

برای قالب بندی داده ها از Accessors & Mutator استفاده کنید

آیا قبل از ذخیره یا بازیابی آن نیاز به تبدیل داده ها دارید؟ دسترسی ها و جهش ها برای کمک به اینجا هستند.

دسترسی ها (داده های قالب در مورد بازیابی)

class User extends Model
{
    public function getFullNameAttribute()
    {
        return ucfirst($this->first_name) . ' ' . ucfirst($this->last_name);
    }
}

echo $user->full_name; // John Doe
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

mutators (قبل از ذخیره سازی داده ها را اصلاح کنید)

class User extends Model
{
    public function setPasswordAttribute($value)
    {
        $this->attributes['password'] = bcrypt($value);
    }
}

$user->password = 'mypassword';
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

رمز عبور به طور خودکار قبل از صرفه جویی در هشدار داده می شود.

پنجم

ویژگی های مدل پیشرفته

هنگامی که با اصول اولیه راحت هستید ، در اینجا برخی از ویژگی های مدل قدرتمند برای کشف وجود دارد:

🔹 بازیگران ویژگی

Laravel به شما امکان می دهد تا ویژگی هایی را به انواع داده های متداول بکشید:

class User extends Model
{
    protected $casts = [
        'is_admin' => 'boolean',
        'created_at' => 'datetime',
        'preferences' => 'array',
    ];
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اکنون ، is_admin همیشه یک بولی را برمی گرداند ، و ترجیحات هنگام بازیابی آرایه ای خواهد بود.

🔹 نرم حذف می شود

use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
    use SoftDeletes;
    protected $dates = ['deleted_at'];
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اکنون ، سوابق حذف شده در پایگاه داده بمانند و قابل ترمیم هستند!

🔹 رویدادهای مدل سفارشی

آیا می خواهید هنگام ایجاد یا به روزرسانی یک مدل منطق را اجرا کنید؟ از رویدادهای مدل استفاده کنید!

class User extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::created(function ($user) {
            Mail::to($user->email)->send(new WelcomeEmail());
        });
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 ناظران برای رسیدگی به رویداد مدل بهتر

به جای تعریف منطق رویداد در داخل مدل ، می توانید از ناظران برای تمیز نگه داشتن مدل های خود استفاده کنید:

class UserObserver
{
    public function created(User $user)
    {
        Mail::to($user->email)->send(new WelcomeEmail());
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

Observer را در داخل AppServiceProvider.php ثبت کنید. اکنون ، هر بار که کاربر ایجاد می شود ، یک ایمیل ارسال می شود.

ششم

افکار نهایی

مدل های لاراول فوق العاده قدرتمند هستند ، اما اگر به درستی استفاده نشود ، می توانند مشکل باشند. بهترین روشها را دنبال کنید ، از مشکلات مشترک خودداری کنید و از ویژگی های داخلی Laravel استفاده کنید تا کد خود را تمیز و کارآمد نگه دارید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا