هنر مدل های 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 استفاده کنید تا کد خود را تمیز و کارآمد نگه دارید.