Wie das in Laravel geht, Unterabfrage wo in


120

Wie kann ich diese Abfrage in Laravel durchführen:

SELECT 
    `p`.`id`,
    `p`.`name`, 
    `p`.`img`, 
    `p`.`safe_name`, 
    `p`.`sku`, 
    `p`.`productstatusid` 
FROM `products` p 
WHERE `p`.`id` IN (
    SELECT 
        `product_id` 
    FROM `product_category`
    WHERE `category_id` IN ('223', '15')
)
AND `p`.`active`=1

Ich könnte dies auch mit einem Join tun, aber ich benötige dieses Format für die Leistung.

Antworten:


198

Betrachten Sie diesen Code:

Products::whereIn('id', function($query){
    $query->select('paper_type_id')
    ->from(with(new ProductCategory)->getTable())
    ->whereIn('category_id', ['223', '15'])
    ->where('active', 1);
})->get();

1
Akzeptiert diese Antwort, ist die Frage nicht mehr aktuell, da sie Laravel 3 betrifft, und die eingehenden Antworten beziehen sich auf Laravel 4. Die unten stehende Antwort funktioniert auch für 4.
Marc Buurke

3
@lukaserat die betreffende Abfrage wendet das UND an p. active= 1 Überprüfung der Produkttabellen, während Ihre Abfrage sie auf die Tabelle der Produktkategorie anwendet .... richtig? oder fehlt mir etwas ..?
Hhsadiq

@hhsadiq Ja, es bezieht sich auf die Produktkategorie.
Lukaserat

1
Netter Ansatz mit dem Tabellennamen. Es ist ein Plus für mich
Alwin Kesler

Arbeiten Sie gut für Laravel 5.5
Oleg Shakhov

52

Schauen Sie sich die erweiterte Wherees-Dokumentation für Fluent an: http://laravel.com/docs/queries#advanced-wheres

Hier ist ein Beispiel dafür, was Sie erreichen möchten:

DB::table('users')
    ->whereIn('id', function($query)
    {
        $query->select(DB::raw(1))
              ->from('orders')
              ->whereRaw('orders.user_id = users.id');
    })
    ->get();

Dies wird produzieren:

select * from users where id in (
    select 1 from orders where orders.user_id = users.id
)

Das kommt mir sehr nahe und ich beschäftige mich schon seit einiger Zeit mit ähnlichen Fragen. Wobei where_in (Laravel 3) zwei Argumente erfordert, wobei das zweite ein Array ist. Irgendeine Idee, wie man das richtig macht? Ich glaube auch nicht, dass Laravel 3 die from-Methode unterstützt.
Marc Buurke

Ah, Laravel3 ... Ja, das wird dann schwierig. Und ich denke, in Laravel3 verwenden Sie die table()Methode anstelle von from(). Ich hatte diese Situation in L3 nicht, sorry!
Drawjoh

Ich kann keine whereIn-Methode sehen, die ein Lambda in Illuminate \ Database \ Query \ Builder verwendet. Wurde es in whereSub umbenannt?
Nbransby

20

Sie können eine Variable verwenden, indem Sie das Schlüsselwort "use ($ category_id)" verwenden.

$category_id = array('223','15');
Products::whereIn('id', function($query) use ($category_id){
   $query->select('paper_type_id')
     ->from(with(new ProductCategory)->getTable())
     ->whereIn('category_id', $category_id )
     ->where('active', 1);
})->get();

5

Der folgende Code hat bei mir funktioniert:

$result=DB::table('tablename')
->whereIn('columnName',function ($query) {
                $query->select('columnName2')->from('tableName2')
                ->Where('columnCondition','=','valueRequired');

            })
->get();

3

Sie können Eloquent in verschiedenen Abfragen verwenden und das Verständnis und die Verwaltung erleichtern:

$productCategory = ProductCategory::whereIn('category_id', ['223', '15'])
                   ->select('product_id'); //don't need ->get() or ->first()

und dann setzen wir alle zusammen:

Products::whereIn('id', $productCategory)
          ->where('active', 1)
          ->select('id', 'name', 'img', 'safe_name', 'sku', 'productstatusid')
          ->get();//runs all queries at once

Dadurch wird dieselbe Abfrage generiert, die Sie in Ihrer Frage geschrieben haben.


2

Das Skript wird in Laravel 5.x und 6.x getestet. Der staticVerschluss kann in einigen Fällen die Leistung verbessern.

Product::select(['id', 'name', 'img', 'safe_name', 'sku', 'productstatusid'])
            ->whereIn('id', static function ($query) {
                $query->select(['product_id'])
                    ->from((new ProductCategory)->getTable())
                    ->whereIn('category_id', [15, 223]);
            })
            ->where('active', 1)
            ->get();

generiert die SQL

SELECT `id`, `name`, `img`, `safe_name`, `sku`, `productstatusid` FROM `products` 
WHERE `id` IN (SELECT `product_id` FROM `product_category` WHERE 
`category_id` IN (?, ?)) AND `active` = ?

1

Laravel 4.2 und höher kann versuchen, Beziehungen abzufragen: -

Products::whereHas('product_category', function($query) {
$query->whereIn('category_id', ['223', '15']);
});

public function product_category() {
return $this->hasMany('product_category', 'product_id');
}

0
Product::from('products as p')
->join('product_category as pc','p.id','=','pc.product_id')
->select('p.*')
->where('p.active',1)
->whereIn('pc.category_id', ['223', '15'])
->get();

0

mit einer Variablen

$array_IN=Dev_Table::where('id',1)->select('tabl2_id')->get();
$sel_table2=Dev_Table2::WhereIn('id',$array_IN)->get();

-2

Bitte versuchen Sie dieses Online-Tool sql2builder

DB::table('products')
    ->whereIn('products.id',function($query) {
                            DB::table('product_category')
                            ->whereIn('category_id',['223','15'])
                            ->select('product_id');
                        })
    ->where('products.active',1)
    ->select('products.id','products.name','products.img','products.safe_name','products.sku','products.productstatusid')
    ->get();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.