راکت

نمایش عنوان محصول در نظرات

17 پاسخ

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

به این شکل نوشتم

                                    <td>{{ $comment->commentable->title }}</td>

ولی ارور زیر دریافت کردم

Trying to get property 'title' of non-object (
ثبت پرسش جدید

پاسخ‌ها

17
Pouria
Pouria
@pouria.782

تخصص: developer

ابتدا بررسی کنید ببینید آیا

$comment->commentable

مقدار بر میگردونه

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

بله برمیگردونه مشکلی نداره مسیر مدل ها نمایش میده
ولی عنوان محصول میخام به ارور میخوره

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

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

رابطه commentable رو توی مدل Comment به چه شکل تعریف کردی؟

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@ali.bayat
به این شکل


class Comment extends Model
{
    protected $fillable = [
        'comment' ,
        'approved' ,
        'parent_id' ,
        'commentable_id' ,
        'commentable_type'
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function child()
    {
        return $this->hasMany(Comment::class , 'parent_id' , 'id');
    }

    public function commnetable()
    {
        return $this->morphTo();
    }
}
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

وقتی از متد morphTo استفاده میکنی ...
instance ای از مدل commentabletype و با آی‌‌دی commentableid برگشت داده میشه که معمولا یک مدل هست، و نتیجتا مقدار برگشتی یک آبجکت خواهد بود..
اما با توجه به متن ارور

Trying to get property 'title' of non-object

به نظر میرسه comment->commentable$ در اینجا یه آبجکت نیست...

برای دیباگ کدت میتونی از tinker استفاده کنی

php artisan tinker
$comment = Comment::first();
gettype($comment->commentable)        // 1
get_class($comment->commentable)      // 2
$comment->commentable->title       // 3

۱. نوع برگشتی رو چک کن و مطمئن شو که object هست
۲. کلاس برگشتی رو چک کن و مطمئن شو مدل مورد نظر هست
۳. در آخر ببین فیلد title مقداری رو برای اون مدل برگشت میده یا نه...

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@ali.bayat
چیزی که فرمودید انجام دادم نتیجه به این شکل شد
مشکل کجاست ؟

 php artisan tinker
Psy Shell v0.10.12 (PHP 7.3.33 — cli) by Justin Hileman
>>> $comment = Comment::first()
[!] Aliasing 'Comment' to 'App\Models\Comment' for this Tinker session.
=> App\Models\Comment {#4725
     id: 10,
     user_id: 3,
     commentable_id: 4,
     commentable_type: "App\Models\frontend\Course",
     parent_id: 0,
     approved: 1,
     comment: "عالی بود واقعا خوب توضیح دادید",
     created_at: "2022-03-11 21:14:05",
     updated_at: "2022-03-11 21:14:57",
   }
>>> gettype($comment->commentable)
=> "NULL"
>>> get_class($comment->commentable)
<warning>PHP Warning:  get_class() expects parameter 1 to be object, null given in C:\xampp\htdocs\project.ireval()'d code on line 1</warning>
=> false
>>> $comment->commentable->title
<warning>PHP Notice:  Trying to get property 'title' of non-object in C:\xampp\htdocs\idejet.ireval()'d code on line 1</warning>      
=> null
>>>
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

ببینید وقتی gettype داره null برمیگردونه.. اون اروری که داشتی خیلی طبیعی هست..
چون null آبجکت نیست که شما بتونی فیلد title اش رو نمایش بدی..

به نظر میرسه رابطه ای که تعریف کردی به درستی کار نمیکنه

آیا namespace به درستی برای این مدل (App\Models\frontend\Course) تعریف شده؟

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@ali.bayat
بله namespace درست تعریف شده

مدل course

    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }

مدل comment

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function child()
    {
        return $this->hasMany(Comment::class , 'parent_id' , 'id');
    }

    public function commnetable()
    {
        return $this->morphTo();
    }

مدل user

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

رابطه هایی که ارسال کردی مشکلی ندارند.. اما رابطه morphTo که در Comment داری ، جوابی رو که باید بر نمیگردونه
وگرنه مراحل ۱ و ۲ دیباگ برابر میشد با
"object"
و
"App\Models\frontend\Course"

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@ali.bayat

مشکل غلط املایی بود
حل شد
ممنونم

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

آره 😂
commnetable
من هم اصلا بهش دقت نکردم..

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@ali.bayat
ممنونم از وقتی که گذاشتید 😅

یسوال دیگه هم دارم حالا میخام زمانی که رو title کلیک شد وارد دوره مربوطه بشه
به این شکل که نوشتم اشتباهه

   <td>
                                        <a href="https://roocket.ir/{{ $comment->commentable->title }}">
                                            {{ $comment->commentable->title }}
                                        </a>
                                    </td>
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

حتما یه route توی سیستمت برای دوره ها داری

از اون route استفاده کن و comment->commentable->id$ رو بهش پاس بده

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

حتما یه route توی سیستمت برای دوره ها داری

از اون route استفاده کن و comment->commentable->id$ رو بهش پاس بده

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@ali.bayat
درسته فقط مشکلی که دارم من هم برای بخش دوره ها هم برای بخش مقالات کامنت تعریف کردم
نمیدونم چجوری این دو بخش رو لینکش جدا در نظر بگیرم

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

اون فیلد commentable_type که داری داره به مدل مورد نظر تو رابطه پالی مورفیک اشاره میکنه
ازش استفاده کن
اگر مقدارش برابر با مدل Course باشه ، کامنتت مربوط به دوره است
اگر هم مدل Post باشه ، مربوط به مقالاته

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@ali.bayat
یه همچین چیز ی که اشتباه انجام دادم😂

               <td>
                                        <a href="https://roocket.ir/($comment->commentable_type == 'App\Models\Course' ? 'courses' : 'articles'){{ $comment->commentable->slug }}">
                                            {{ $comment->commentable->title }}
                                        </a>
                                    </td>

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

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