कैसे एकाधिक जहां खामियों को दूर करने के लिए लार्वा लूप का उपयोग करें?


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(...)कॉल, एट सेटेरा द्वारा बदला जा सकता है ।
जोंथनमारवेंस 19

1
@Jarek Tkaczyk के समाधान का उत्तर होना चाहिए, मैं सहमत हूं। लेकिन मैं आपके कोड को पसंद और रखरखाव के लिए बिल्डर स्क्रिप्ट की तरह पसंद करूंगा।
तियानान जु

जवाबों:


618

में Laravel 5.3 (और अब भी के रूप में सच 7.x ) आप एक सरणी के रूप में पारित की छोटी से छोटी wheres उपयोग कर सकते हैं:

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

व्यक्तिगत रूप से मुझे इसके लिए केवल कई whereकॉल पर उपयोग-मामला नहीं मिला है , लेकिन तथ्य यह है कि आप इसका उपयोग कर सकते हैं।

जून 2014 से आप एक सरणी को पास कर सकते हैं 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
आप ऑपरेटर को कैसे निर्दिष्ट करते हैं?
14

9
@Styphon तुम नहीं। वर्तमान में यह केवल साथ काम करता है =
जारेक टाकज़ीक

5
@ साइंटन और क्या होगा अगर मैं बनाना चाहता हूं WHERE (a IS NOT NULL AND b=1) OR (a IS NULL AND b=2);:?
एलेक्सगेल

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

अधिक जानकारी के लिए दस्तावेज़ के इस भाग की जाँच करें 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.wikipedia.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
यह सवाल से अलग कैसे है?
वीकेन


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

खोज फ़ाइडसाइड या sql साइड में होती है?
श्री मोहम्मद

सकाल पक्ष। 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'));
    }
}

यह SQL इंजेक्शन के लिए बहुत कमजोर है।
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);
}

यह कई प्रश्नों का निष्पादन करेगा।
वीकेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.