سلام وقت بخیر
من از روش پولی مورفیک نظرات سایتو درست کردم
حالا میخام تو پنل مدیریت نمایش بدم برای کدوم پست نظر ارسال شد
بر اساس عنوان میخام دوره میخام نمایش بده
به این شکل نوشتم
<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
>>>@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
ممنونم از وقتی که گذاشتید 😅
یسوال دیگه هم دارم حالا میخام زمانی که رو title کلیک شد وارد دوره مربوطه بشه
به این شکل که نوشتم اشتباهه
<td>
<a href="https://roocket.ir/{{ $comment->commentable->title }}">
{{ $comment->commentable->title }}
</a>
</td>@ali.bayat
درسته فقط مشکلی که دارم من هم برای بخش دوره ها هم برای بخش مقالات کامنت تعریف کردم
نمیدونم چجوری این دو بخش رو لینکش جدا در نظر بگیرم
@ali.bayat
یه همچین چیز ی که اشتباه انجام دادم😂
<td>
<a href="https://roocket.ir/($comment->commentable_type == 'App\Models\Course' ? 'courses' : 'articles'){{ $comment->commentable->slug }}">
{{ $comment->commentable->title }}
</a>
</td>