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.

Marc Buurke
quelle

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();
lukaserat
quelle
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
)
Drawjoh
quelle
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();
Ramesh
quelle
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();
Aditya Singh
quelle
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.

Philipe
quelle
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` = ?
Madan Sapkota
quelle
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');
}
LC Yoong
quelle
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();
panqingqiang
quelle
0

mit einer Variablen

$array_IN=Dev_Table::where('id',1)->select('tabl2_id')->get();
$sel_table2=Dev_Table2::WhereIn('id',$array_IN)->get();
a3rxander
quelle
-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();
liquid207
quelle