راکت
حل شده

کوئری روی دو جدول که با هم رابطه‌ی 1به1 دارند با الکوئنت

5 پاسخ

با سلام
من دو جدول users و letters رو دارم. رابطه بینشون تعریف شده و یک به یک است.
این روابط در مدل‌هام که مشکلی ندارند.
User

public function letter()
{
    return $this->hasOne('App\Letter');
}

Letter

public function user()
{
    return $this->belongsTo('App\User');
}

ولی من قصد دارم بتونم روی هر دو جدولم شرط بذارم و خروجی رو دریافت کنم، ولی تنها امکان شرط گذاشتن در روی یک جدول رو دارم، و اون هم جدولی است که مدلش رو فراخونی کردم:

public function index()
{
    $users = User::where('role', 'simpleuser')
        ->orderBy('id', 'asc')->paginate(30);

    return view('index', compact('users'));
}

اما من قصد دارم یک چنین چیزی اتفاق بیفته که نمونه‌ای که در ذهنمه رو آوردم که باهاش به خطا می‌خورم. یعنی بتونم هم روی جدول users کوئری بزنم و هم جدول letters. چون وقت dump می‌گیرم، relationهای هر رکورد جدول که در جدول دیگه وجود داره نمایش داده می‌شوند، پس باید به نحوی روی اون‌ها هم بتونم کوئری بزنم.
ممنون می‌شم راهنمایی کنید و خطای کندم رو اصلاح کنید.

public function index()
{
    $users = User::where('role', 'student')
        ->where('letter.status', 'approved')
        ->orderBy('id', 'asc')->paginate(30);

    return view('index', compact('users'));
}
احسان
احسان
@ehsan99
ثبت پرسش جدید

پاسخ‌ها

5
رضا پارسیان
رضا پارسیان
@Rp76

تخصص: توسعه دهنده Php , Laravel

بهترین پاسخ

سلام وقتتون بخیر!

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

User::whereHas("letter",function($qyuery){
    $query->where("count">10);
})->with("letter")->first();

توی مثال بالا سعی دارم letter هایی که بیشتر از ۱۰ هست رو بیارم

احسان
احسان
@ehsan99

تخصص: توسعه دهنده وب

سلام مجدد خدمت شما @Rp76
ممنون از پاسختون. این رو قبلاً جایی دیدم پس از گوگل کردن که از anonymous function استفاده کرده. ولی دقتی روش نکردم و مجدد که شما ذکر کردید، بررسی کردم و به درستی جواب داد و از این بابت یک دنیا ممنونم ازتون که وقت گذاشتید و مشکل بنده حل شد.

احسان
احسان
@ehsan99

تخصص: توسعه دهنده وب

سلام
امکان داره در این مورد هم راهنماییم کنید. کد زیر به صورت کامل تا زمانی که شروط همگی True باشند، درست کار می‌کنه.

$users = User::with(['proposal' => function ($query) {
    $query->where('step_one','completed')
    ->where('is_approved_by_admin','approved');
 }])->where('role', 'student')
    ->orderBy('id', 'asc')
    ->paginate(30);

اما در صورتی که حتی یکی از شروط هم برقرار نباشه، خطای زیر برگشت داده می‌شه:

 Attempt to read property "arabic_title" on null (View: C:\xampp\htdocs\script\resources\views\admin\primary\index.blade.php) 

چطور می‌شه این مورد رو هندل کرد. چون طبیعیه که بعضی از شروط True نخواهند بود.

@mohaligateway @hesammousavi @ali.bayat @Rp76

شاید پاسخ شما همین‌جا باشد

رضا پارسیان
رضا پارسیان
@Rp76

تخصص: توسعه دهنده Php , Laravel

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

اگر گفتید

{{$data->name}}

بجاش بگید

{{@$data->name}}
{{$data->name ?? ""}}
احسان
احسان
@ehsan99

تخصص: توسعه دهنده وب

ممنون از شما. برای اون دسته از عزیزانی که شاید به مشکل من برخورده باشند، من با تغییر زیر در نهایت مشکلم برطرف شد:

$proposals = Proposal::with(['user' => function ($query) {
    $query->where('role', 'student');
}])->where('step_one', 'completed')
    ->where('is_approved_by_admin','approved')
    ->orderBy('id', 'asc')
    ->paginate(30);

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

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