একাধিক যেখানে লারাভেল স্পষ্টত ব্যবহার করে ক্লজ ক্যোয়ারী তৈরি করবেন?


405

আমি লারাভেল ইলিউভেন্ট ক্যোয়ারী বিল্ডারটি ব্যবহার করছি এবং আমার কাছে এমন একটি কোয়েরি রয়েছে যেখানে আমি WHEREএকাধিক শর্তে ক্লজ চাই । এটি কাজ করে, তবে এটি মার্জিত নয়।

উদাহরণ:

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

এটি করার আরও ভাল উপায় আছে, বা এই পদ্ধতির সাথে আমার থাকা উচিত?


4
এটিকে কীভাবে সহজ করা যায় তার দিক থেকে অনেকগুলি সম্ভাবনা রয়েছে তবে এর জন্য আরও কিছু বাস্তবসম্মত কোড প্রয়োজন। আপনি কি কোডটি আরও বাস্তবসম্মত হতে আপডেট করতে পারেন? উদাহরণস্বরূপ, এমন অনেক সময় আসে যখন একাধিক ->where(...)কল একটি ->whereIn(...)কল, এবং সেটার দ্বারা প্রতিস্থাপন করা যায় ।
jonathanmarvens

1
@ জারেক টাকাকজিকের সমাধানটির উত্তর হওয়া উচিত, আমি সম্মত। তবে আমি আপনার কোডটি বোধকতা এবং রক্ষণাবেক্ষণের জন্য বিল্ডার স্ক্রিপ্টের মতো পছন্দ করব।
তিফান জুল

উত্তর:


618

ইন Laravel 5.3 (এবং এখনও যেমন সত্য 7.x ) আপনি একটি অ্যারের হিসাবে পাস আরো ঝুরা কোথায় ব্যবহার করতে পারেন:

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

ব্যক্তিগতভাবে আমি এর জন্য কেবল একাধিক whereকলের জন্য ব্যবহারের সন্ধান পাইনি , তবে সত্য আপনি এটি ব্যবহার করতে পারেন।

জুন ২০১৪ সাল থেকে আপনি এখানে একটি অ্যারে পাস করতে পারেন where

যতক্ষণ আপনি সমস্ত wheresব্যবহারের andঅপারেটর চান, আপনি তাদের এইভাবে গ্রুপ করতে পারেন:

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

// if you need another group of wheres as an alternative:
$orThose = ['yet_another_field' => 'yet_another_value', ...];

তারপর:

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

// with another group
$results = User::where($matchThese)
    ->orWhere($orThose)
    ->get();

উপরোক্ত ফলাফল যেমন ফলাফল হিসাবে:

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

8
আপনি কিভাবে অপারেটর নির্দিষ্ট করবেন?
স্টিফোন

9
পছন্দ করেছেন বর্তমানে এটি শুধুমাত্র সাথে কাজ করে =
জেরেক টাকাকজেক

5
@Styphon এবং কি আমি করতে চান তাহলে: WHERE (a IS NOT NULL AND b=1) OR (a IS NULL AND b=2);?
alexglue

9
আপনি এর মতো শর্তগুলির একটি অ্যারেও পাস করতে পারেন:$users = DB::table('users')->where([ ['status', '=', '1'], ['subscribed', '<>', '1'], ])->get();
শূন্য-ও-

3
@ জারেক: whereNotInআপনার উত্তর অনুসারে অন্যান্য whereক্লুজ থাকার সাথে আমি কীভাবে অন্তর্ভুক্ত করব?
কলঙ্কা

93

ক্যোরি স্কোপগুলি আপনাকে আপনার কোডটি আরও বেশি পঠনযোগ্য হতে দেয়।

http://laravel.com/docs/eloquent#query-scopes

এই উদাহরণটি কয়েকটি উদাহরণ সহ আপডেট করা:

আপনার মডেলটিতে, স্কোপ পদ্ধতিগুলি এটি তৈরি করুন:

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

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

তারপরে, আপনি আপনার ক্যোয়ারীটি তৈরি করার সময় এই স্কোপগুলি কল করতে পারেন:

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

এই জাতীয় শর্তের জন্য সর্বোত্তম অনুশীলনটি কী, কোয়েরি-> যেখানে ('start_date'> $ startDate) এখনও স্কোপগুলি ব্যবহার করা ঠিক আছে?
বুওয়ানেকা কালানসুরিয়া

72

আপনি বেনামে ফাংশনগুলিতে এ জাতীয় উপকরণগুলি ব্যবহার করতে পারেন:

 $results = User::where('this', '=', 1)
            ->where('that', '=', 1)
            ->where(function($query) {
                /** @var $query Illuminate\Database\Query\Builder  */
                return $query->where('this_too', 'LIKE', '%fake%')
                    ->orWhere('that_too', '=', 1);
            })
            ->get();

43

এই ক্ষেত্রে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

User::where('this', '=', 1)
    ->whereNotNull('created_at')
    ->whereNotNull('updated_at')
    ->where(function($query){
        return $query
        ->whereNull('alias')
        ->orWhere('alias', '=', 'admin');
    });

এটি আপনাকে এমন একটি কোয়েরি সরবরাহ করবে:

SELECT * FROM `user` 
WHERE `user`.`this` = 1 
    AND `user`.`created_at` IS NOT NULL 
    AND `user`.`updated_at` IS NOT NULL 
    AND (`alias` IS NULL OR `alias` = 'admin')

36

অ্যারে ব্যবহারের শর্তাদি:

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

বেলোর মতো কোয়েরি তৈরি করবে:

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

নামবিহীন ফাংশন ব্যবহারের শর্তাদি:

$users = User::where('column1', '=', value1)
               ->where(function($query) use ($variable1,$variable2){
                    $query->where('column2','=',$variable1)
                   ->orWhere('column3','=',$variable2);
               })
              ->where(function($query2) use ($variable1,$variable2){
                    $query2->where('column4','=',$variable1)
                   ->where('column5','=',$variable2);
              })->get();

বেলোর মতো কোয়েরি তৈরি করবে:

SELECT * FROM TABLE WHERE column1=value1 and (column2=value2 or column3=value3) and (column4=value4 and column5=value5)

12

একাধিক যেখানে ধারা

    $query=DB::table('users')
        ->whereRaw("users.id BETWEEN 1003 AND 1004")
        ->whereNotIn('users.id', [1005,1006,1007])
        ->whereIn('users.id',  [1008,1009,1010]);
    $query->where(function($query2) use ($value)
    {
        $query2->where('user_type', 2)
            ->orWhere('value', $value);
    });

   if ($user == 'admin'){
        $query->where('users.user_name', $user);
    }

অবশেষে ফলাফল পাচ্ছি

    $result = $query->get();

9

whereColumnপদ্ধতি একাধিক অবস্থার একটি অ্যারের প্রেরণ করা সম্ভব। এই শর্তগুলি andঅপারেটর ব্যবহার করে যোগ দেওয়া হবে ।

উদাহরণ:

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

আরও তথ্যের জন্য ডকুমেন্টেশন এই অ w শটি পরীক্ষা https://laravel.com/docs/5.4/queries#where-clauses


8
Model::where('column_1','=','value_1')->where('column_2 ','=','value_2')->get();

অথবা

// If you are looking for equal value then no need to add =
Model::where('column_1','value_1')->where('column_2','value_2')->get();

অথবা

Model::where(['column_1' => 'value_1','column_2' => 'value_2'])->get();

5

সাব কোয়েরিতে অন্য যে কোনও ফিল্টার প্রয়োগ করতে ভুলবেন না অন্যথায় বা সমস্ত রেকর্ড সংগ্রহ করতে পারে।

$query = Activity::whereNotNull('id');
$count = 0;
foreach ($this->Reporter()->get() as $service) {
        $condition = ($count == 0) ? "where" : "orWhere";
        $query->$condition(function ($query) use ($service) {
            $query->where('branch_id', '=', $service->branch_id)
                  ->where('activity_type_id', '=', $service->activity_type_id)
                  ->whereBetween('activity_date_time', [$this->start_date, $this->end_date]);
        });
    $count++;
}
return $query->get();

'ব্যবহার ($ পরিষেবা)' যুক্ত করার জন্য ধন্যবাদ। জুলজানের উত্তরটি আমার প্রায় প্রয়োজন ছিল। আপনার মন্তব্যটি আমাকে অনুসন্ধানের স্ট্রিংটিকে ক্যোয়ারিতে যেতে সহায়তা করেছে।
এলিয়ট রবার্ট

5
$projects = DB::table('projects')->where([['title','like','%'.$input.'%'],
    ['status','<>','Pending'],
    ['status','<>','Not Available']])
->orwhere([['owner', 'like', '%'.$input.'%'],
    ['status','<>','Pending'],
    ['status','<>','Not Available']])->get();

3

সত্যিকারের উদাহরণ ব্যতীত কোনও সুপারিশ করা কঠিন। যাইহোক, আমার কখনই কোয়েরিতে এমন অনেকগুলি শুল্ক ব্যবহার করার প্রয়োজন হয়নি এবং এটি আপনার ডেটার কাঠামোর সাথে কোনও সমস্যা নির্দেশ করতে পারে।

ডেটা সাধারণকরণ সম্পর্কে আপনার পক্ষে শিখতে সহায়ক হতে পারে: http://en.wikedia.org/wiki/Third_normal_form


3

আপনি লারাভেল 5.3বুদ্ধিমান ব্যবহার করতে পারেন

সমস্ত ফলাফল

UserModel::where('id_user', $id_user)
                ->where('estado', 1)
                ->get();

আংশিক ফলাফল

UserModel::where('id_user', $id_user)
                    ->where('estado', 1)
                    ->pluck('id_rol');

3
এটি প্রশ্ন থেকে আলাদা কীভাবে?
ভেকসেন

2

whereInশর্ত ব্যবহার করুন এবং অ্যারে পাস করুন

$array = [1008,1009,1010];

User::whereIn('users.id', $array)->get();


1

নীচে যেমন দেখানো হয়েছে তেমন ধারাটিতে আপনি অ্যারে ব্যবহার করতে পারেন।

$result=DB::table('users')->where(array(
'column1' => value1,
'column2' => value2,
'column3' => value3))
->get();

1
DB::table('users')
            ->where('name', '=', 'John')
            ->orWhere(function ($query) {
                $query->where('votes', '>', 100)
                      ->where('title', '<>', 'Admin');
            })
            ->get();

1

আমার পরামর্শ অনুযায়ী আপনি যদি ফিল্টার করছেন বা অনুসন্ধান করছেন

তাহলে আপনার সাথে যেতে হবে:

        $results = User::query();
        $results->when($request->that, function ($q) use ($request) {
            $q->where('that', $request->that);
        });
        $results->when($request->this, function ($q) use ($request) {
            $q->where('this', $request->that);
        });
        $results->when($request->this_too, function ($q) use ($request) {
            $q->where('this_too', $request->that);
        });
        $results->get();

অনুসন্ধান কি phpside বা স্কেল পাশ হতে পারে?
মিঃ মোহাম্মদ

বর্গ পাশে। SQL কোয়েরি অনুরোধ পরামিতি হিসাবে চালানো। প্রাক্তন। যদি অনুরোধ হয় এই পরম আছে। তারপরে কোথায় এটি = '' শর্তটি কোয়েরিতে যুক্ত হয়েছে।
ধ্রুব রাওয়াল


0

খাঁটি বুদ্ধিমান ব্যবহার করে, এটি এর মতো বাস্তবায়ন করুন। এই কোডগুলি লগইন করা সমস্ত ব্যবহারকারীদের ফিরিয়ে দেয় যাদের অ্যাকাউন্টগুলি সক্রিয় রয়েছে। $users = \App\User::where('status', 'active')->where('logged_in', true)->get();


0

কোডের একটি নমুনা।

প্রথমত:

$matchesLcl=[];

ক্রমগুলি ক্রমবর্ধমানভাবে শর্তগুলির পছন্দসই গণনা / লুপ ব্যবহার করে অ্যারেটি পূর্ণ হয় :

if (trim($request->pos) != '') $matchesLcl['pos']= $request->pos;

এবং এখানে:

if (trim($operation) !== '')$matchesLcl['operation']= $operation;

এবং আরও বুদ্ধিমানের সাথে আরও:

if (!empty($matchesLcl))
    $setLcl= MyModel::select(['a', 'b', 'c', 'd'])
        ->where($matchesLcl)
        ->whereBetween('updated_at', array($newStartDate . ' 00:00:00', $newEndDate . ' 23:59:59'));
else 
    $setLcl= MyModel::select(['a', 'b', 'c', 'd'])
        ->whereBetween('updated_at', array($newStartDate . ' 00:00:00', $newEndDate . ' 23:59:59'));

-4
public function search()
{
    if (isset($_GET) && !empty($_GET))
    {
        $prepareQuery = '';
        foreach ($_GET as $key => $data)
        {
            if ($data)
            {
                $prepareQuery.=$key . ' = "' . $data . '" OR ';
            }
        }
        $query = substr($prepareQuery, 0, -3);
        if ($query)
            $model = Businesses::whereRaw($query)->get();
        else
            $model = Businesses::get();

        return view('pages.search', compact('model', 'model'));
    }
}

এটি এসকিউএল ইঞ্জেকশনের পক্ষে খুব দুর্বল।
rrrhys

-21
$variable = array('this' => 1,
                    'that' => 1
                    'that' => 1,
                    'this_too' => 1,
                    'that_too' => 1,
                    'this_as_well' => 1,
                    'that_as_well' => 1,
                    'this_one_too' => 1,
                    'that_one_too' => 1,
                    'this_one_as_well' => 1,
                    'that_one_as_well' => 1);

foreach ($variable as $key => $value) {
    User::where($key, '=', $value);
}

এটি একাধিক অনুসন্ধান চালায় exec
ভেকসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.