سلام
از طریق کد زیر میتونیم اطلاعات یک جدول فچ کنیم.
posts::all();
حالا توی این جدول post یک user_id هستش میخوام زمانی که دیتا فچ میشه بجای اینکه ایدی نمایش بده بره اون ایدی توی جدول دیگه جستجو کنه و فقط نام اونو دربیاره.
آسون ترین و استاندارد ترین روش توی لاراول چی هستش؟
سلام وقت بخیر
اگه متوجه شده باشم شما میخواین با استفاده از userid که توی جدول posts هست برید و نام کاربر رو دربیارید و نمایش بدید؟ برای اینکار میتونید از resource ها استفاده کنید یکی از کارهایی که resource انجام میده اینه که شما مجموعه ای از کالکشن ها رو بهشون میدی و اونجا میتونی ویرایش کنی و برای هر کالشن تغییرات لازم رو بدی برای این کار باید اول یک resource ایجاد کنی این دستور رو توی ترمینال یا کامنلاین وارد کن
php artisan make:resource ResourceName
و بجای ResourceName اسم resource رو وارد کن وقتی ایجاد شد برای پیدا کردنشتوی این مسیر باید بری
App\Http\Resources
و با همون اسمی که بهش دادی اونجا هست بازش میکنی و همه محتویات داخل فانکشن toArray رو پاک کن تا به این شکل در بیاد
public function toArray(Request $request): array
{
}
بعد باید پست هارو بهش پاس بدی همونجایی که همه پست هارو میگیری posts::all() بایدبه اینشکل بشه
$posts = ResourceName::collection(posts::all())
خوب حالا اینجا تموم میشه و باید بری دوباره توی فایل resouurce اونجا به همه محتویات این کالکشن ها دسترسی داری از توی $this چون همه محتویات به اونجا ارسال میشه حالا شما میتونید از userid استفاده کنید و کاربر رو پیدا کنید و اسمش رو نمایش بدید و میتونید هم اطلاعات خود پست رو نمایش بدین هم اطلاعات یوزر و هم کامنتا و ... خیلی جالبه
public function toArray(Request $request): array
{
$user = User::find($this->user_id); // پیدا کردن کاربر با ایدی
return [
'id' => $this->id, // اطلاعات پست
'user' => $user->name, // اطلاعات کاربر
'description' => $this->description, // اطلاعات پست
'time' => Carbon::createFromTimestamp(strtotime($this->created_at))->diffForHumans() // اطلاعات پست
];
}
این یکی از روش هایی هست که میتونی استفاده کنی من خودم با این روش خیلی حال میکنم گفتم شاید توهم استفاده کردی خوشت اومد از ریلیشن ها هم میشه استفاده کرد اما اول باید یکم درباره رابطه های چند به چند یک به چند و یک به یک تحقیق کنید تا بفهمی کدومشون چیکار میکنه و چجوری انجام میشه حالا اونم میشه ولی این روش ساده تره
بهترین روش از ریلیشن ها استفاده کنید یک پست متعلق به یک کاربر هست شما از ریلیشن یک به یک استفاده کنید .
درون Models/Post فانگشن زیر رو بنویسید .
public $with=['user']
public function user(){
return $this->belongsTo(User::class);
}
و در قسمت نمایش برای فراخوانی فقط کافیست کد زیر رو بنویسید .
$post->user->name
سلام ممنون از توضیحات خوبت.
من مراحل رفتم ولی کار نکرد!! و فقط دیتای جدول post نشون میده! توی فاکشن toArray چیزی که ریترن میشه هم تغیر میدم ولی توی خروجی فرقی نمیکنه
دوست عزیز با با این روشی که گفتم میتونی از ریلیشن ها هم استفاده کنی و طریقه استفادش رو هم میگم چجوریه توی Model پست ها باید یه رابطه برقراری با یوزر ها
public function user():BelongTo{
return $this->belongsTo(User::class,"user_id");
}
و توی مدل یوزر هم میتونی یه ریلیشن تعریف کنی که پست های اون یوزر رو بگیره به این صورت
public function posts(): HasMany {
return $this->hasMany(Posts::class,'user_id');
}
بعد توی Resource باید به این صورت انجام بدی
public function toArray($request)
{
return [
'post_title' => $this->title,
'post_content' => $this->content,
'user_name' => $this->user->name,
];
}
و در آخر هم برای استفاده از این پست ها باید داخل کنترولر به این صورت پیشبرید
public function index()
{
$posts = Posts::all();
$postsResources = PostsResource::collection($posts);
return view('posts.index', compact('postsResources'));
}
و برای استفاده توی سایت برای دیدن اینجوری میشه
@foreach ($postsResources as $postResource)
<div>
<h2>{{ $postResource->post_title }}</h2>
<p>{{ $postResource->post_content }}</p>
<p>نام کاربری: {{ $postResource->user_name }}</p>
</div>
@endforeach
امید وارم مشکلت حل بشه اگه نشد بگو تا روش دیگه ای بهت بگم انجامش بدی ولی طبیعتا باید حل بشه اینجوری
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟