معماری روابط پیچیده در لاراول

۲۴ اردیبهشت ۱۳۹۷

طراحی سایت

Laravel یک چارچوب PHP است که با استفاده از Eloquent یک ORM قدرتمند و شگفت انگیز، که به شما اجازه می دهد تا پرس و جو های پیچیده SQL را با یک روش بسیار ساده انجام دهید. اما گاهی اوقات شما نیاز به بیشتر از این دارید، و در اینجا من به شما یک نکته جالب توجه ارائه می دهم که می تواند انعطاف پذیری زیادی به شما در پروژه های طراحی سایت بدهد.

اگر درخواستهای پایگاه داده ساده ای در لاراول داشته باشید چالشهای زیادی نخواهید داشت ولی در درخواستهای پیچیده به مشکل برخواهید خورد.

اگر هر post تعداد نامحدود comment دارد و هر post متعلق به یک comment باشد به شکل زیر در laravel eloquent عمل می کنیم:


use Illuminate\Database\Eloquent\Model as Eloquent;

class Post extends Eloquent
{
    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

class Comment extends Eloquent
{
    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function post()
    {
        return $this->belongsTo(Post::class);
    }
}

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


$post = Post::find(1);
$comments = $post->comments;

Querying

اگر شما نیاز به قدرت بیشتری دارید، می توانید از روش های whereHas و orWhereHas استفاده کنید تا موقعیت های "where" را در خود داشته باشید. این روش به شما امکان اضافه کردن محدودیت های سفارشی به یک محدودیت رابطه را میدهد، مانند چک کردن محتوا در یک نظر:

// Retrieve all posts with at least one comment containing words like foo%
$posts = App\Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
})->get();

The Relation

شما می توانید با دستورات زیر بین جداول ارتباط برقرار کنید.


$post = Post::whereHas(...)->first();
$post->comments; // all post comments

اما در دستور بالا همه comment ها برگشت داده می شود ودر بین comment ها اگر بخواهید کلمه foo را جستجو کنید راه کار چیست؟

راه حل

شما با استفاده از eager loading و with میتوانید داده های جداول دیگر را فراخوانی کنید. شما با استفاده از whereHas و with وهمچنین با استفاده از local variable، داده ها را در filter$ جمع آوری می شود:


$posts = Post::whereHas('comments', $filter = function ($query) {
    $query->where('content', 'like', 'foo%');
})->get();

و سپس با with آنرا فراخوانی می کنیم:


$posts = Post::whereHas('comments', $filter = function ($query) {
    $query->where('content', 'like', 'foo%');
})->with(['comments' => $filter])->get();

همچنین با دستور زیر شما می توانید comment اضافه کنید:


$post = Post::find(1);

$post->comments()->saveMany([
    new Comment(['content' => 'foo is good']),
    new Comment(['content' => 'bar is better']),
]);

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


$post = Post::whereHas(...)->with(...)->get()->first();
$this->assertCount(1, $post->comments);
$this->assertEquals('foo is good', $post->comments->first()->content);

 نویسنده:حمید شاه محمدی
 تعداد مشاهده خبر:(535)
 هر روز از مقاله های جدید طراحی سایت در کانال تلگرام ما با خبر شوید

 میانگین امتیازات:
 
  تعداد رای دهندگان: {{ count }}
نظرات:

{{ x }}
{{ alert }}

نویسنده:{{ com.name }}
{{ com.body }}
{{ com.created_at }}