راکت
sajjad
sajjad
توسط sajjad مطرح شد
حل
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'}
    }
}

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


ثبت پرسش جدید
محمدحسن یگانه
محمدحسن یگانه
تخصص :Full-Stack Web Developer Freelancer
@mhyeganeh5 سال پیشمطرح شد
1

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

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);

بهرام
بهرام
تخصص :Laravel Developer
@bahram5 سال پیشمطرح شد
0

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


sajjad
sajjad
تخصص :برنامه نویس
@sajjad1235 سال پیشمطرح شد
0

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

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

    }

Controller

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

@bahram


محمدحسن یگانه
محمدحسن یگانه
تخصص :Full-Stack Web Developer Freelancer
@mhyeganeh5 سال پیشمطرح شد
1

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

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);

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

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