Cách thực hiện điều này trong Laravel, truy vấn con ở đâu trong


120

Làm cách nào để thực hiện truy vấn này trong 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

Tôi cũng có thể làm điều này với một tham gia, nhưng tôi cần định dạng này để thực hiện.

Câu trả lời:


199

Hãy xem xét mã này:

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
Đã chấp nhận câu trả lời này, câu hỏi đã lỗi thời như liên quan đến Laravel 3 và các câu trả lời sắp tới là dành cho Laravel 4, câu trả lời bên dưới cũng sẽ hoạt động cho 4.
Marc Buurke,

3
@lukaserat truy vấn được đề cập đang áp dụng AND p. active= 1 lần kiểm tra trên bảng sản phẩm trong khi truy vấn của bạn đang áp dụng nó cho bảng của Danh mục sản phẩm .... đúng không ?? hoặc là có cái gì đó tôi đang thiếu ..?
hhsadiq

@hhsadiq vâng, nó đang đề cập đến ProductCategory.
lukaserat

1
Cách tiếp cận tốt với tên bảng. Đó là một điểm cộng cho tôi
Alwin Kesler

Làm việc tốt cho laravel 5,5
Oleg Shakhov

53

Hãy xem tài liệu wheres nâng cao cho Fluent: http://laravel.com/docs/queries#advanced-wheres

Đây là một ví dụ về những gì bạn đang cố gắng đạt được:

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

Điều này sẽ tạo ra:

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

Điều đó đến gần và tôi đã phân vân với các truy vấn tương tự trong một thời gian. Nhưng where_in (laravel 3) yêu cầu 2 đối số, đối số thứ hai là một mảng. Bất kỳ ý tưởng làm thế nào để có được điều này đúng? Ngoài ra, tôi không nghĩ laravel 3 hỗ trợ phương thức from.
Marc Buurke

Ah, Laravel3 ... Vâng, điều đó sẽ khó khăn. Và tôi nghĩ rằng trong Laravel3 bạn sử dụng table()phương thức thay vì from(). Tôi chưa gặp trường hợp đó trong L3, xin lỗi!
Drawjoh

Tôi không thể thấy phương thức whereIn lấy lambda trong Illuminate \ Database \ Query \ Builder. Nó đã được đổi tên thành whereSub chưa?
nbransby

20

Bạn có thể sử dụng biến bằng cách sử dụng từ khóa "sử dụng ($ 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();

5

Đoạn mã sau phù hợp với tôi:

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

            })
->get();

3

Bạn có thể sử dụng Eloquent trong các truy vấn khác nhau và làm cho mọi thứ dễ hiểu và dễ hiểu hơn:

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

và sau đó chúng tôi tập hợp tất cả lại với nhau:

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

Điều này sẽ tạo ra cùng một truy vấn mà bạn đã viết trong câu hỏi của mình.


2

Tập lệnh được thử nghiệm trong Laravel 5.x và 6.x. Việc staticđóng cửa có thể cải thiện hiệu suất trong một số trường hợp.

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

tạo 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 trở lên, có thể sử dụng thử truy vấn mối quan hệ: -

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

sử dụng một biến

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

-2

Vui lòng thử công cụ trực tuyến sql2builder này

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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.