165 votes

Comment faire dans Laravel, subquery où dans

Comment puis-je faire cette requête dans Laravel :

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

Je pourrais aussi le faire avec une jointure, mais j'ai besoin de ce format pour des raisons de performance.

251voto

lukaserat Points 333

Considérez ce 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();

77voto

drewjoh Points 501

Jetez un coup d'œil à la documentation avancée sur les clauses d'origine pour Fluent. Voici un exemple de ce que vous essayez d'obtenir :

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

Cela produira :

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

24voto

ramesh Points 350

Vous pouvez utiliser une variable en utilisant le mot clé "use ($category_id)".

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

9voto

Philipe Points 101

Vous pouvez utiliser Eloquent dans différentes requêtes et rendre les choses plus faciles à comprendre et à gérer :

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

et ensuite on met tout ensemble :

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

Cela va générer la même requête que celle que vous avez écrite dans votre question.

6voto

Madan Sapkota Points 3464

Le script est testé dans Laravel 5.x et 6.x. Le static La fermeture peut améliorer les performances dans certains cas.

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

génère le 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` = ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X