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

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

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

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

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

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

Trying to get property 'title' of non-object (

ثبت پرسش جدید
Pouria
تخصص : developer
@pouria.782 3 سال پیش مطرح شد
0

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

$comment->commentable

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


Paradox
تخصص : در حال یادگیری
@paradox 3 سال پیش مطرح شد
0

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


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

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


Paradox
تخصص : در حال یادگیری
@paradox 3 سال پیش مطرح شد
0

@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 3 سال پیش آپدیت شد
2

وقتی از متد 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 3 سال پیش آپدیت شد
0

@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 3 سال پیش آپدیت شد
0

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

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

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


Paradox
تخصص : در حال یادگیری
@paradox 3 سال پیش مطرح شد
0

@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 3 سال پیش مطرح شد
0

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


Paradox
تخصص : در حال یادگیری
@paradox 3 سال پیش مطرح شد
0

@ali.bayat

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


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

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


Paradox
تخصص : در حال یادگیری
@paradox 3 سال پیش مطرح شد
0

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

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

   <td>
                                        <a href="{{ $comment->commentable->title }}">
                                            {{ $comment->commentable->title }}
                                        </a>
                                    </td>

علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

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

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


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

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

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


Paradox
تخصص : در حال یادگیری
@paradox 3 سال پیش مطرح شد
0

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


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
0

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


Paradox
تخصص : در حال یادگیری
@paradox 3 سال پیش آپدیت شد
0

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

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

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

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