احسان
3 سال پیش توسط احسان مطرح شد
5 پاسخ

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

با سلام
من دو جدول 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'));
}

ثبت پرسش جدید
رضا پارسیان
تخصص : توسعه دهنده Php , Laravel
@Rp76 3 سال پیش آپدیت شد
1

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

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

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

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


احسان
تخصص : توسعه دهنده وب
@ehsan99 3 سال پیش مطرح شد
1

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


احسان
تخصص : توسعه دهنده وب
@ehsan99 3 سال پیش آپدیت شد
0

سلام
امکان داره در این مورد هم راهنماییم کنید. کد زیر به صورت کامل تا زمانی که شروط همگی 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


رضا پارسیان
تخصص : توسعه دهنده Php , Laravel
@Rp76 3 سال پیش آپدیت شد
1

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

اگر گفتید

{{$data->name}}

بجاش بگید

{{@$data->name}}
{{$data->name ?? ""}}

احسان
تخصص : توسعه دهنده وب
@ehsan99 3 سال پیش مطرح شد
0

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

$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);

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

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