سلام وقت بخیر
من از روش پولی مورفیک نظرات سایتو درست کردم
حالا میخام تو پنل مدیریت نمایش بدم برای کدوم پست نظر ارسال شد
بر اساس عنوان میخام دوره میخام نمایش بده
به این شکل نوشتم
<td>{{ $comment->commentable->title }}</td>
ولی ارور زیر دریافت کردم
Trying to get property 'title' of non-object (
@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();
}
}
وقتی از متد 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
مقداری رو برای اون مدل برگشت میده یا نه...
@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
>>>
ببینید وقتی gettype داره null برمیگردونه.. اون اروری که داشتی خیلی طبیعی هست..
چون null آبجکت نیست که شما بتونی فیلد title اش رو نمایش بدی..
به نظر میرسه رابطه ای که تعریف کردی به درستی کار نمیکنه
آیا namespace به درستی برای این مدل (App\Models\frontend\Course) تعریف شده؟
@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);
}
رابطه هایی که ارسال کردی مشکلی ندارند.. اما رابطه morphTo که در Comment داری ، جوابی رو که باید بر نمیگردونه
وگرنه مراحل ۱ و ۲ دیباگ برابر میشد با
"object"
و
"App\Models\frontend\Course"
@ali.bayat
ممنونم از وقتی که گذاشتید 😅
یسوال دیگه هم دارم حالا میخام زمانی که رو title کلیک شد وارد دوره مربوطه بشه
به این شکل که نوشتم اشتباهه
<td>
<a href="{{ $comment->commentable->title }}">
{{ $comment->commentable->title }}
</a>
</td>
حتما یه route توی سیستمت برای دوره ها داری
از اون route استفاده کن و comment->commentable->id$
رو بهش پاس بده
حتما یه route توی سیستمت برای دوره ها داری
از اون route استفاده کن و comment->commentable->id$
رو بهش پاس بده
@ali.bayat
درسته فقط مشکلی که دارم من هم برای بخش دوره ها هم برای بخش مقالات کامنت تعریف کردم
نمیدونم چجوری این دو بخش رو لینکش جدا در نظر بگیرم
اون فیلد commentable_type که داری داره به مدل مورد نظر تو رابطه پالی مورفیک اشاره میکنه
ازش استفاده کن
اگر مقدارش برابر با مدل Course باشه ، کامنتت مربوط به دوره است
اگر هم مدل Post باشه ، مربوط به مقالاته
@ali.bayat
یه همچین چیز ی که اشتباه انجام دادم😂
<td>
<a href="($comment->commentable_type == 'App\Models\Course' ? 'courses' : 'articles'){{ $comment->commentable->slug }}">
{{ $comment->commentable->title }}
</a>
</td>
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟