2015-01-30 24 views
6

Tôi đang cố gắng sử dụng phương thức orWhereHas trong Laravel với các quan hệ lồng nhau, nhưng tôi không nhận được kết quả mong đợi. Tôi có hiểu lầm cách sử dụng phương pháp này không?Laravel hoặcWhereĐã không hoạt động như mong đợi

mối quan hệ của tôi được thiết lập như sau:

Product 
    -> hasOne uniqueItem 
     -> hasMany fulfillmentCenterUniqueItems 
    -> hasMany skus 
     -> hasOne uniqueItem 
      -> hasMany fulfillmentCenterUniqueItems 

Tôi đang cố gắng để kiểm tra các whereHasorWhereHas phương pháp bằng cách lấy sản phẩm từ cơ sở dữ liệu có chứa uniqueItems rằng có một uniqueItemFulfillmentCenter với id = 7089 HOẶC sản phẩm có chứa a sku, có chứa uniqueItem, có uniqueItemFulfillmentCenter với id = 7412.

Dựa trên dữ liệu trong cơ sở dữ liệu của tôi, kết quả của truy vấn này phải là hai sản phẩm. ID sản phẩm 105 và 239.

Dưới đây là mã hùng biện Tôi đang sử dụng:

$product = Spire_models\Product 
    ::whereHas('uniqueItem.fulfillmentCenterUniqueItems', function ($query) 
    { 
      $query->where('id', 7089); 
    }) 
    ->orWhereHas('skus.uniqueItem.fulfillmentCenterUniqueItems', function ($query) 
    { 
      $query->where('id', 7412); 
    }) 
    ->get()->toArray(); 

Đối với một số lý do, điều này chỉ trở lại sản phẩm ID 105, thay vì 105 và 239. Các sql tạo ra từ chức năng này là:

select * from `products` where `products`.`deleted_at` is null and (select count(*) from `unique_items` where `products`.`unique_item_id` = `unique_items`.`id` and (select count(*) from `fulfillment_center_unique_items` where `fulfillment_center_unique_items`.`unique_item_id` = `unique_items`.`id` and `id` = 7089 and `fulfillment_center_unique_items`.`deleted_at` is null) >= 1 and `unique_items`.`deleted_at` is null) >= 1 and (select count(*) from `skus` where `skus`.`product_id` = `products`.`id` and (select count(*) from `unique_items` where `skus`.`unique_item_id` = `unique_items`.`id` or (select count(*) from `fulfillment_center_unique_items` where `fulfillment_center_unique_items`.`unique_item_id` = `unique_items`.`id` and `id` = 7412 and `fulfillment_center_unique_items`.`deleted_at` is null) >= 1 and `unique_items`.`deleted_at` is null) >= 1 and `skus`.`deleted_at` is null) >= 1 

sql này có được tạo không đúng hoặc tôi đang sử dụng phương pháp orWhereHas không? Với tôi nó không giống như câu lệnh OR đang được đặt chính xác trong sql.

Nếu tôi xóa phương thức orWhereHas, mọi thứ hoạt động như mong đợi. Ví dụ, nếu tôi chạy này:

$product = Spire_models\Product 
    ::whereHas('uniqueItem.fulfillmentCenterUniqueItems', function ($query) 
    { 
      $query->where('id', 7089); 
    }) 
    ->get()->toArray(); 

tôi một cách chính xác nhận lại sản phẩm ID 105. Nếu tôi chạy này:

$product = Spire_models\Product 
    ::whereHas('skus.uniqueItem.fulfillmentCenterUniqueItems', function ($query) 
    { 
      $query->where('id', 7412); 
    }) 
    ->get()->toArray(); 

tôi một cách chính xác nhận lại sản phẩm ID 239. Vì vậy, các phần riêng lẻ của truy vấn hoạt động chính xác, nhưng có vẻ như khi tôi cố gắng kết hợp chúng với một orWhereHas, tôi nhận được kết quả không mong muốn. Bất kỳ ý tưởng tại sao?

EDIT

Theo các ý kiến, có vẻ như đây là một lỗi. Tôi đã có thể tạm thời làm việc xung quanh nó bằng cách viết lại mã để sử dụng whereorWhere. Đây là giải pháp tạm thời:

$product = Spire_models\Product 
    ::where(function ($query) 
    { 
      $query->whereHas('uniqueItem.fulfillmentCenterUniqueItems', function ($query) 
      { 
        $query->where('id', 7089); 
      }); 
    }) 
    ->orWhere(function ($query) 
    { 
      $query->whereHas('skus.uniqueItem.fulfillmentCenterUniqueItems', function ($query) 
      { 
        $query->where('id', 7412); 
      }); 
    }) 
    ->get()->toArray(); 
+0

Yep, đó là một lỗi. cần sửa chữa –

+0

Cảm ơn @JarekTkaczyk. Tôi nên làm gì đây? Báo cáo sự cố trong Github? – flyingL123

+1

Có, vui lòng báo cáo sự cố. Tôi đã thực hiện một sửa chữa, chỉ cần điều chỉnh các bài kiểm tra và sẽ đẩy PR vào ngày mai. –

Trả lời

Các vấn đề liên quan