Laravel, به عنوان یک چارچوب محبوب برنامهنویسی وب، با ویژگیها و امکانات فراوان خود، توجه بسیاری از توسعهدهندگان را جلب کرده است. یکی از بخشهای حیاتی Laravel که برنامهنویسان باید با آن آشنا باشند، Eloquent است. در این مقاله، به بررسی ترفندهای پیشرفته برای کوئریهای کارآمد با Laravel Eloquent میپردازیم.
1. روابط بارگذاری Lazy :
روابط بارگذاری Lazy میتواند با بارگیری دادههای مرتبط تنها در صورت نیاز، عملکرد را به طور قابل توجهی بهبود بخشد. برای فعال کردن بارگذاری Lazy می توانید از متد with
استفاده کنید.
در زیر یک مثال برای این نوع بارگذاری را آوردیم:
$user = User::find(1);
// Lazy load the user's posts when needed
$posts = $user->posts;
2. بارگیری ستون های خاص با Eager:
هنگام eager loading روابط، می توانید ستون های مورد نیاز خود را مشخص کنید و میزان داده های بازیابی شده از پایگاه داده را کاهش دهید.
$users = User::with(['posts' => function ($query) {
$query->select('id', 'title');
}])->get();
3. Scope های سراسری:
اسکوب های سراسری به شما امکان می دهد محدودیت هایی را تعریف کنید که به طور خودکار برای همه کوئری ها برای یک مدل خاص اعمال می شوند.
// Define a global scope for soft-deleted records
protected static function boot()
{
parent::boot();
static::addGlobalScope('softDeleted', function ($builder) {
$builder->where('deleted', 0);
});
}
4. انتخاب Subquery :
از Subquery در متد select
برای کوئری های پیچیده بدون استفاده از SQL خام استفاده کنید.
$latestPosts = Post::select('title', 'created_at')
->whereIn('id', function ($query) {
$query->select('post_id')
->from('comments')
->where('approved', 1);
})
->get();
5. روابط چند شکلی:
روابط چند شکلی به یک مدل اجازه می دهد که به بیش از یک مدل دیگر تعلق داشته باشد.
class Comment extends Model
{
public function commentable()
{
return $this->morphTo();
}
}
6. استفاده از متد tap :
متد tap به شما این امکان را میدهد که در یک فراخوان به نمونه سازنده query کوئری بزنید.
$users = User::where('active', 1)
->tap(function ($query) {
// Perform additional actions on the query builder
$query->orderBy('name');
})
->get();
7. دستورات خام:
از دستورات خام برای شرایط یا محاسبات پیچیده استفاده کنید.
$users = User::select(DB::raw('COUNT(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
8. کارخانه های مدل:
از model factories برای تولید داده های جعلی برای آزمایش و پر کردن دیتا در پایگاه های داده استفاده کنید.
use Illuminate\Database\Eloquent\Factories\Factory;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
];
}
}
9. Scope کوئری:
کوئری های خود را با تعریف محدوده های جستجوی قابل استفاده مجدد در مدل های خود سازماندهی کنید.
class User extends Model
{
public function scopeActive($query)
{
return $query->where('active', 1);
}
}
// Usage
$activeUsers = User::active()->get();
10. کوئری های ذخیره سازی:
برای بهبود عملکرد، کوئری های خود را کش کنید در زیر یک مثال برای کش کردن همه کاربر ها آمده است.
$users = Cache::remember('all_users', 60, function () {
return User::all();
});
11. روابط پویا با when:
با استفاده از متد When، روابط را بر اساس معیارهای خاص به صورت مشروط تعریف کنید.
$relation = User::when($isAdmin, function ($query) {
return $query->hasMany('App\Post');
}, function ($query) {
return $query->hasMany('App\Comment');
})->get();
12. مدل های Pivot سفارشی:
هنگام برخورد با روابط چند به چند، از مدلهای محوری سفارشی برای افزودن فیلدها یا رفتارهای اضافی استفاده کنید.
class RoleUser extends Pivot
{
// Custom fields or methods
}
13. تکه تکه کردن نتایج:
مجموعه داده های بزرگ را به طور موثر با استفاده از روش تکه پردازش کنید تا نتایج را در بخش های کوچکتر تکرار کنید.
User::orderBy('id')->chunk(200, function ($users) {
foreach ($users as $user) {
// Process each user
}
});
14. روابط مشروط با unless:
با استفاده از متد unless روابط را به صورت مشروط تعریف کنید.
$relation = User::unless($isGuest, function ($query) {
return $query->hasMany('App\Post');
})->get();
15. Scope کوئری های سراسری با کلاس های ناشناس:
برای سازماندهی بهتر، محدوده کوئری های سراسری را با استفاده از کلاس های ناشناس تعریف کنید.
protected static function boot()
{
parent::boot();
static::addGlobalScope(new class implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('active', 1);
}
});
}
16. استفاده از Pluck برای جفت های کلید-مقدار:
جفت های کلید-مقدار را با استفاده از روش Pluck به طور موثر بازیابی کنید.
$userRoles = User::pluck('role', 'id');
17. کوئری از ستون های JSON:
از قدرت ستون های JSON در پایگاه داده برای ذخیره سازی انعطاف پذیر داده ها استفاده کنید.
$users = User::where('meta->status', 'active')->get();
18. ResourceCollection
ها در الکونت:
مدلهای Eloquent خود را به منابع API برای خروجی دادههای تمیز و سازگار تبدیل کنید.
class UserCollection extends ResourceCollection
{
public function toArray($request)
{
return [
'data' => $this->collection,
'meta' => ['key' => 'value'],
];
}
}
19. شمارش مدل های مرتبط:
تعداد مدل های مرتبط را به طور موثر بازیابی کنید.
$userCount = User::withCount('posts')->find(1);
echo $userCount->posts_count;
20. سفارشی کردن نام جدول محوری:
یک نام جدول سفارشی برای جدول محوری در روابط چند به چند مشخص کنید.
class User extends Model
{
public function roles()
{
return $this->belongsToMany('App\Role', 'user_roles');
}
}
نتیجه
تسلط بر این ترفندهای پیشرفته لاراول Eloquent شما را قادر می سازد تا با سناریوهای پیچیده مقابله کنید و تعاملات پایگاه داده خود را بهینه کنید. این تکنیک ها را آزمایش کنید تا مهارت های توسعه لاراول خود را ارتقا دهید و برنامه های کاربردی قوی و با کارایی بالا بسازید.