Laravel Eloquent kullanarak birden çok nerede yan tümce sorgu oluşturmak nasıl?


405

Laravel Eloquent sorgu oluşturucu kullanıyorum ve WHEREbirden çok koşulda bir cümle istediğim bir sorgu var . Çalışıyor, ama zarif değil.

Misal:

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

Bunu yapmanın daha iyi bir yolu var mı, yoksa bu yönteme bağlı kalmalı mıyım?


4
Bunun nasıl basitleştirilebileceği konusunda birçok olasılık var, ancak bu daha gerçekçi bir kod gerektirecektir. Kodu biraz daha gerçekçi olacak şekilde güncelleyebilir misiniz? Örneğin, birden çok ->where(...)çağrının bir ->whereIn(...)çağrı ile değiştirilebileceği zamanlar vardır, vb .
jonathanmarvens

2
Cevap @Jarek Tkaczyk'in çözümü olmalı, katılıyorum. Ancak anlama ve bakım için kodunuzu builder betiği gibi tercih ederim.
Tiefan Ju

Yanıtlar:


618

Gelen laravel 5.3 (ve hala doğru 7. x ) bir dizi olarak kabul daha ayrıntılı WHERES kullanabilir:

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

Şahsen bunun için birden fazla whereçağrıda kullanım durumu bulamadım , ama gerçek şu ki kullanabilirsiniz.

Haziran 2014'ten bu yana bir dizi where

Tüm whereskullanım andoperatörünü istediğiniz sürece , bunları şu şekilde gruplayabilirsiniz:

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

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

Sonra:

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

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

Yukarıdakiler böyle bir sorgu ile sonuçlanacaktır:

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

8
Operatörü nasıl belirtirsiniz?
Styphon

9
@Styphon Yapmazsın. Şu anda sadece ile çalışıyor =.
Jarek Tkaczyk

5
@Styphon ve ne ben yapmak istiyorsanız: WHERE (a IS NOT NULL AND b=1) OR (a IS NULL AND b=2);?
alexglue

9
Bunun gibi bir dizi koşulu da geçebilirsiniz:$users = DB::table('users')->where([ ['status', '=', '1'], ['subscribed', '<>', '1'], ])->get();
sıfırlar ve olanlar

3
@jarek: whereNotInCevabınıza göre diğer whereipuçlarına sahip olmayı nasıl ekleyebilirim?
Kalanka

93

Sorgu kapsamları, kodunuzun daha okunabilir olmasına yardımcı olabilir.

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

Bu cevabı bazı örneklerle güncelleme:

Modelinizde, bunun gibi kapsam yöntemleri oluşturun:

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

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

Ardından, sorgunuzu oluştururken bu kapsamları çağırabilirsiniz:

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

böyle bir durum için en iyi uygulama hangisidir? query-> where ('start_date'> $ startDate) Scopes'i kullanmak hala uygun mu?
Buwaneka Kalansuriya

72

Alt sorguları şu şekilde anonim işlevde kullanabilirsiniz:

 $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

Bu durumda şöyle bir şey kullanabilirsiniz:

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

Size aşağıdaki gibi bir sorgu sağlamalıdır:

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

Dizi kullanan koşullar:

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

Feryat gibi sorgu üretecek:

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

Antonymous İşlevini Kullanan Koşullar:

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

Feryat gibi sorgu üretecek:

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

12

Birden çok nerede yan tümcesi

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

sonunda sonuç elde

    $result = $query->get();

9

whereColumnYöntem, çeşitli durumların bir dizi geçirilebilir. Bu koşullar andoperatör kullanılarak birleştirilecektir .

Misal:

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

Daha fazla bilgi için https://laravel.com/docs/5.4/queries#where-clauses belgesinin bu bölümüne bakın.


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

VEYA

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

VEYA

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

5

Alt sorgulara başka filtreler uyguladığınızdan emin olun, aksi takdirde veya tüm kayıtları toplayabilir.

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

'Use ($ service)' öğesini eklediğiniz için teşekkür ederiz. Juljan'ın cevabı neredeyse ihtiyacım olan şeydi. Yorumunuz arama dizimi sorguya geçirmeme yardımcı oldu.
Elliot Robert

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

Gerçek bir örnek olmadan, bir tavsiye yapmak zordur. Ancak, bir sorguda bu kadar WHERE yan tümcesini kullanmak zorunda kalmadım ve verilerinizin yapısında bir sorun olduğunu gösterebilir.

Veri normalizasyonu hakkında bilgi edinmeniz yardımcı olabilir: http://en.wikipedia.org/wiki/Third_normal_form


3

Laravel 5.3'te eloquent kullanabilirsiniz

Tüm sonuçlar

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

Kısmi sonuçlar

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

3
Bunun sorudan farkı nedir?
veksen

2

kullanmak whereIndurumunu ve dizi geçirmek

$array = [1008,1009,1010];

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


1

Burada gösterildiği gibi, cümlede diziyi kullanabilirsiniz.

$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

Filtre veya arama yapıyorsanız önerime göre

o zaman gitmelisin:

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

arama phpside veya sql tarafında mı oluyor?
Bay Mohamed

Sql tarafı. SQL sorgusu istek parametresi olarak yürütülür. ex. requrst bu param varsa. Sonra bu = '' burada koşul sorguya eklendi.
Dhruv Raval

1

Bunu kullan

$users = DB::table('users')
                    ->where('votes', '>', 100)
                    ->orWhere('name', 'John')
                    ->get();

0

Saf Eloquent kullanarak, böyle uygulayın. Bu kod, hesapları etkin olan tüm oturum açmış kullanıcıları döndürür. $users = \App\User::where('status', 'active')->where('logged_in', true)->get();


0

Bir kod örneği.

Birinci olarak :

$matchesLcl=[];

dizi, istenen sayıda sayım / döngü döngüsünü kullanarak buraya kademeli olarak doldurulur :

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

ve burada:

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

ve ayrıca aşağıdakiler gibi ifadeler ile:

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'));
    }
}

Bu SQL enjeksiyonuna karşı çok savunmasızdır.
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);
}

Bu, birden çok sorgu yürütür.
veksen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.