sajjad
4 سال پیش توسط 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 Freel...
@mhyeganeh 4 سال پیش مطرح شد
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
@bahram 4 سال پیش مطرح شد
0

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


sajjad
تخصص : برنامه نویس
@sajjad123 4 سال پیش آپدیت شد
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 Freel...
@mhyeganeh 4 سال پیش مطرح شد
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);

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

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