جستجو در بخش : سوال جواب منابع اسلامی لغت نامه ها قوانین و مصوبات نقل قل ها
×

فرم ورود

ورود با گوگل ورود با گوگل ورود با تلگرام ورود با تلگرام
رمز عبور را فراموش کرده ام عضو نیستم، می خواهم عضو شوم
×

×

آدرس بخش انتخاب شده


جهت کپی کردن میتوانید از دکمه های Ctrl + C استفاده کنید
رویداد ها - امتیازات
در حال بارگذاری
×

رویداد ها - امتیازات

برای بررسی عملکرد فعالیت و امتیازات خود باید در وب سایت وارد باشید. در صورت عضویت از بخش بالای صفحه وارد شوید، در غیر این صورت از دکمه پایین، مستقیم به صفحه ثبت نام وارد شوید.

×
×
×

دلیل درخواست بستن پست

کلیه پست هایی که جنبه تبلیغاتی داشته، محتوای اسپم و بی مفهوم در این دسته قرار میگیرند. همچنین پست هایی که به منظور گرفتن بک لینک درج می شوند شامل این مورد هستند.
حاوی مفاهیم غیر اخلاقی، سیاسی و یا توهین آمیز. کلیه پست هایی که از نظر محتوایی نیاز به بررسی و یا حذف شدن دارند در این دسته قرار می گیرند.
محتوایی با عدم جزئیات کافی و مورد نیاز. کلیه پست هایی که منظور نویسنده به وضوح مشخص نیست و نیازمند توضیحات و جزئیات بیشتر می باشند در این دسته قرار می گیرند.
محتوایی بی ربط با موضوعیت سرفصل کلی. کلیه پست هایی که از منظر مفهوم و مضمون ارتباطی با عنوان اصلی سوال ندارند در این دسته قرار می گیرند.
محتوایی دلخواه و بر پایه سلیقه. کلیه پست هایی که یک پاسخ مشخص ندارند و متوانند چندین پاسخ متفاوت و صحیح داشته باشند که کاملا مبتنی بر نظر شخصی افراد هستند در این دسته قرار می گیرند.
محتوایی در حوزه خیلی وسیع. کلیه پست هایی که از نظر محتوایی در یک حوزه ی وسیعی قرار دارند و مشخصا به یک موضوع خاصی اشاره ندارند که پاسخدهی به آن ها مستلزم تشریح مفاهیمی کلی می باشند در این دسته قرار می گیرند.
قبلا در لام تا کام مطرح شده. پست هایی که دقیقا با همین محتوا و مضمون قبلا در وب سایت لام تا کام درج شده اند، با ذکر آدرس منبع تکراری با پست حال حاضر شامل این دسته هستند. تکراری است با:
به سایر دلایل، نیازمند به بررسی توسط مدیر. به هر دلیل غیری که پست را نیازمند بررسی توسط مدیر کرده، با ذکر دلیل، در این دسته قرار میگیرد.
ارسال رای بستن

چگونه در لاراول یک شرط چند گانه بنویسم؟


2
0
1633

من از در لاراول (Laravel) از الکونت (Eloquent) استفاده می کنم برای این که چند شرط بتوانم در کوئری خودم بنویسم مجبور هستم به صورت زیر عمل کنم.

$results = User::where('this', '=', 1)
    ->where('that', '=', 1)
    ->where('this_too', '=', 1)
    ->where('that_too', '=', 1)
    ->where('this_as_well', '=', 1)
    ->where('that_as_well', '=', 1)
    ->where('this_one_too', '=', 1)
    ->where('that_one_too', '=', 1)
    ->where('this_one_as_well', '=', 1)
    ->where('that_one_as_well', '=', 1)
    ->get();

این روش به خوبی کار می کند اما همانطور که می بینید به علت تکرار متوالی where و ... تمیز به نظر نمی رسد

سوال من این است آیا اصلا راه بهتری برای اینکار وجود دارد ؟ و اگر هم دارد چگونه امکان پذیر است ؟

تکنولوژی برنامه-نویسی لاراول
سوال شده در فرید صالحی
194 امتیاز

500 کاراکتر باقی مانده

3 جواب

4

در لاراول5.3 به بعد شما می توانید شرط های خود را درون یک آرایه قرار دهید به صورت زیر :

$query->where([
    ['column_1', '=', 'value_1'],
    ['column_2', '<>', 'value_2'],
    [COLUMN, OPERATOR, VALUE],
    ...
])

یا اینکه شما می توانید از یک متغییر که حاوی آرایه است استفاده کنید به صورت زیر ابتدا آرایه را تعریف می کنیم .

 $matchThese = ['field' => 'value', 'another_field' => 'another_value', ...];

  // اگر به یک جاگزین برای شرط خود نیاز دارید .
 $orThose = ['yet_another_field' => 'yet_another_value', ...];

و بعد به صورت زیر داخل کوئری قرار می دهیم :

   $results = User::where($matchThese)->get();

   // به همراه جایگزین
   $results = User::where($matchThese)
   ->orWhere($orThose)
   ->get();

نتیجه Eloquent بالا به صورت SQL اینگونه است :

 SELECT * FROM users
   WHERE (field = value AND another_field = another_value AND ...)
    OR (yet_another_field = yet_another_value AND ...)

و اگر شرط شما در در جا های دیگر نیز زیاد تکرار شده مانند active = 1 می توانید از اسکوب ها در لاراول استفاده کنید.

به صورت زیر در مدل یک اسکوب تعریف میکنیم :

public function scopeActive($query)
{
    return $query->where('active', '=', 1);
}

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

$users = User::active()->get();

به این صورت کد های تمیز تری خواهید داشت .

موفق باشید.

ویرایش شده در 5 سال قبل
جواب داده شده در علی رضایی <m>★</m>
1139 امتیاز

500 کاراکتر باقی مانده


1

ببینید خود متد where میتونه یک آرایه بگیره و تمام اون آیتم های آرایه رو با and بهم وصل میکنه، خیلی ساده و راحت:

$users = User::where([
       'column1' => value1,
       'column2' => value2,
       'column3' => value3
])->get();

که خروجی کد بالا در اسکیوال به شکل زیر میشه:

SELECT * FROM TABLE WHERE column1=value1 and column2=value2 and column3=value3

فکر می کنم این دقیقا همون چیزیه که شما لازم دارید.

جواب داده شده در ساناز رضایی
1366 امتیاز

500 کاراکتر باقی مانده


1

یکی از راه حل ها هم میتونه استفاده از whereColumn باشه. یک متد هست که میشه یک آرایه از چندین شرط رو براش فرستاد که نهایتا اون شروط با عملگر AND بهم JOIN میشن:

به عنوان مثال یک همچین کدی با whereColumn میشه نوشت:

$users = DB::table('users')
            ->whereColumn([
                ['first_name', '=', 'last_name'],
                ['updated_at', '>', 'created_at']
            ])->get();

$users = User::whereColumn([
                ['first_name', '=', 'last_name'],
                ['updated_at', '>', 'created_at']
            ])->get();

تعریفی هم که توی داکیومنتیشن لاراول هم ذکر شده اینه:

The whereColumn method may be used to verify that two columns are equal

که یعنی «زمانی از متد whereColumn استفاده میشه که بخوایم بررسی کنیم که دو تا ستون مساوی هستن یا نه.»

جواب داده شده در سعید مرادی
1933 امتیاز

500 کاراکتر باقی مانده


جواب شما
     
.....
×

×

جعبه لام تا کام


وب سایت لام تا کام جهت نمایش استاندارد و کاربردی در تمامی نمایشگر ها بهینه شده است.

تبلیغات توضیحی


داپ اَپ اولین پلتفرم کش‌بک در ایران
اگه میخوای از خریدهایی که میکنی، پاداش نقدی دریافت کنی داپ اَپ رو نصب کن.

تبلیغات تصویری