محمد
12 ماه پیش توسط محمد مطرح شد
5 پاسخ

کوئری نمایش دیتا از طرق دو جدول در لاراول

سلام
از طریق کد زیر میتونیم اطلاعات یک جدول فچ کنیم.

posts::all();

حالا توی این جدول post یک user_id هستش میخوام زمانی که دیتا فچ میشه بجای اینکه ایدی نمایش بده بره اون ایدی توی جدول دیگه جستجو کنه و فقط نام اونو دربیاره.
آسون ترین و استاندارد ترین روش توی لاراول چی هستش؟


ثبت پرسش جدید
محمد
تخصص : همیشه در حال یادگیری ...
@Mohammad79 12 ماه پیش مطرح شد
میکائیل
تخصص : برنامه نویسی سمت سرور و کلاینت
@FullStack 12 ماه پیش آپدیت شد
0

سلام وقت بخیر
اگه متوجه شده باشم شما میخواین با استفاده از 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() // اطلاعات پست
        ];
    }

این یکی از روش هایی هست که میتونی استفاده کنی من خودم با این روش خیلی حال میکنم گفتم شاید توهم استفاده کردی خوشت اومد از ریلیشن ها هم میشه استفاده کرد اما اول باید یکم درباره رابطه های چند به چند یک به چند و یک به یک تحقیق کنید تا بفهمی کدومشون چیکار میکنه و چجوری انجام میشه حالا اونم میشه ولی این روش ساده تره


حسین افتخارراد
تخصص : نال کد
@hosseinradvictor 12 ماه پیش مطرح شد
0

بهترین روش از ریلیشن ها استفاده کنید یک پست متعلق به یک کاربر هست شما از ریلیشن یک به یک استفاده کنید .
درون Models/Post فانگشن زیر رو بنویسید .

public $with=['user']
public function user(){
return $this->belongsTo(User::class);
}

و در قسمت نمایش برای فراخوانی فقط کافیست کد زیر رو بنویسید .

$post->user->name

محمد
تخصص : همیشه در حال یادگیری ...
@Mohammad79 12 ماه پیش مطرح شد
0

سلام ممنون از توضیحات خوبت.
من مراحل رفتم ولی کار نکرد‍!! و فقط دیتای جدول post نشون میده! توی فاکشن toArray چیزی که ریترن میشه هم تغیر میدم ولی توی خروجی فرقی نمیکنه


میکائیل
تخصص : برنامه نویسی سمت سرور و کلاینت
@FullStack 12 ماه پیش آپدیت شد
0

دوست عزیز با با این روشی که گفتم میتونی از ریلیشن ها هم استفاده کنی و طریقه استفادش رو هم میگم چجوریه توی 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

امید وارم مشکلت حل بشه اگه نشد بگو تا روش دیگه ای بهت بگم انجامش بدی ولی طبیعتا باید حل بشه اینجوری


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

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