محمد حکمتی
3 سال پیش توسط محمد حکمتی مطرح شد
3 پاسخ

فراخوانی فانکشن در رابطه one to many لاراول

سلام .
قراره نظرات تمام مقالاتو واسه ادمین نشون بدم .
به این صورت

 public function show()
    {
       $articles = Article::all();
       return $articles->comments();
    }

کدهای مدل :

 public function comments()
    {
        return $this->hasMany('App\Comment');
    }

اما ارور زیر رو میده

 Method Illuminate\Database\Eloquent\Collection::comments does not exist. 

مشکل از کجاست ؟
@ali.bayat
@endworld
@mhyeganeh
@saman1111


ثبت پرسش جدید
saman
@saman1111 3 سال پیش مطرح شد
0

سلام
شما یک کالکشن دارید نه یه آبجکت از کلاس Article
برای تمام کامنت ها از کد زیر استفاده کنید.

$comments = Comment::all();

علی قنواتی
تخصص : توسعه دهنده وب , لاراول
@aligh 3 سال پیش آپدیت شد
0

سلام دوست عزیز فکر کنم مشکل شما این باشه که

return $articles->comments();

این وقتی کار میکنه که یه مقاله باشه و تمام کامنت هایه اون رو بر میگردونه اما شما بهش چندین تا مقاله دادید 🤔 خوب این جوری نمیشه دیگه
بهترین کار اینه که تمام کامنت هاتونو بگیرید (اگه فقط مال مقاله هستن همه) یا اینکه از خود کامنت هاتونو که برای مقالات هستن برگردونید
اگه میخواید اینجوری به کامنت ها دسترسی داشته باشید باید بزارید تو حلقه و همه رو با هم مرج کنید و اون رو برگردونید که شامل همه کامنت ها میشه

یه خورده فک کنم بد توضیح دادم ولی خلاصه کار اینه که این ارور بدیل اینه که اون توقع داره یدونه مقاله بگیره و نظراتشو برگردونه ولی شما یه
کالکشن از مقالات دارید بر میگردونید
این بنده خدا که خودش نمیره دونه دونه مال هر مقاله رو بگیره یکی کنه برگردونه که


saman
@saman1111 3 سال پیش مطرح شد
0

سلام
شما یک کالکشن دارید نه یه آبجکت از کلاس Article
برای تمام کامنت ها از کد زیر استفاده کنید.

$comments = Comment::all();

محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش مطرح شد
2

دو تا نکته رو توجه داشته باشید:

۱- وقتی با یک کالکشن سر و کار دارید به این روش شدنی نیست و نیاز به یک حلقه foreach دارید تا بتونید نظرات مربوط به هر مقاله رو دریافت کنید.

۲- برای گرفتن کامنت های یک مقاله نباید از پرانتز جلوی comments استفاده کنید.

پس یک راه اینه که در کنترلر این طوری بنویسید:

$articles = Article::with('comments')->get();

و در سمت فرانت اند، با یک حلقه foreach بصورت جداگانه به کامنت های هر مقاله اشاره کنید. مثلا در Blade میشه اینجوری:

@foreach($articles as $article)

    {{ $article->title }}
    {{ $article->body}}

    @foreach($article->comments as $comment )
        {{ $comment ->body }}
    @endforeach

@endforeach

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

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