راکت
حل شده

چگونه در لاراول تمام اطلاعات دو جدول رابطه ای را می توان بدست آورد

3 پاسخ

سلام به همه دوستان
فرض کنیم من دو مدل Post و Comment دارم و بالطبع دو جدول با همین نام در دیتابیس وجود دارد
حالا می خوام متدی رو ایجاد کنم که تمام اطلاعات post و Comment ها رو واکشی کنم، البته از طریق API.

API رو ساختم و متدی رو در کنترلر صدا میزنه، سوال من اینجاست که اون متد رو چطور باید بنویسم.
از hasMany در این متد در مدل Post استفاده کردم اما فقط با متد find در کنترلر می تونم خروجی بگیرم که حتما باید یه آی دی بدیم و یک رکورد دریافت کنیم .
متد all و findAll هم خطا دارم کلا.
json باشه هر post و داخلش یه object دیگه که شامل comment هاش مثل نمونه زیر

{id:1,article:'how to manage the class1',comments:
    {
        {id:1, post_id:1,content:'first content'},
        {id:2, post_id:1,content:'second content'},
        {id:3, post_id:1,content:'third content'}
    }
},
{id:2,article:'how to manage the class2',comments:
    {
        {id:3, post_id:2,content:'first content'},
        {id:4, post_id:2,content:'second content'},
        {id:5, post_id:2,content:'third content'}
    }
},
{id:3,article:'how to manage the class3',comments:
    {
        {id:6, post_id:3,content:'first content'},
        {id:7, post_id:3,content:'second content'},
        {id:8, post_id:3,content:'third content'}
    }
}

دوستان اگه می تونن راهنمایی کنن یا سورسی رو معرفی کنن .
متشکرم

ثبت پرسش جدید

پاسخ‌ها

3
محمدحسن یگانه
محمدحسن یگانه
@mhyeganeh

تخصص: Full-Stack Web Developer Freelancer

بهترین پاسخ

مورد اول اینکه بجای

return $post->toJson();

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

return response()->json($post);

اینجوری یکسری تنظیمات header و ... هم بصورت اتومات انجام میشه و بهتر و اصولی تر هست.

دوم اینکه شما اگر با استفاده از همون with رابطه های مورد نظرتون رو هم eagerload کرده باشید تو خروجی API بهشون بصورت کامل دسترسی خواهید داشت.

$post= Post::with('comments')->get();
return response()->json($post);

و آخر هم اینکه اگر ساختار خاص تری از خروجی مدنظرتون هست می‌تونید از حلقه foreach استفاده کنید و خروجی موردنظرتون رو بسازید. مثلا:

$posts = Post::with('comments')->get();
$data = [];

foreach ($posts as $post) {
    $data [] = [
        'post' => $post,
        'comments' => $post->comments,
        'posts_count' => $posts->count(),
        //...
    ];
}

return response()->json($data);
بهرام
بهرام
@bahram

تخصص: Laravel Developer

اگه میخوای همه پست ها با کامنتاش رو بیاری از with استفاده کن

sajjad
sajjad
@sajjad123

تخصص: برنامه نویس

ممنون از پاسختون،
از with در کنترلر استفاده کردم اما Comments ها رو نشون نمی ده
Post model

public function comments(){
        return $this->hasMany(Comments::class,'postid','id');

    }

Controller

$post= Post::with('comments')->get();
        return $post->toJson();

@bahram

شاید پاسخ شما همین‌جا باشد

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام