Laravel或者哪里没有按预期工作

时间:2015-01-30 17:39:00

标签: php laravel-4 eloquent

我正在尝试使用嵌套关系在Laravel中使用orWhereHas方法,但我没有得到我期望的结果。我误解了如何使用这种方法吗?

我的关系设置如下:

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

我正在尝试通过从包含whereHas orWhereHas uniqueItems的{​​{1}}的数据库中检索产品来测试uniqueItemFulfillmentCenterid = 7089方法包含sku的OR产品,其中包含uniqueItem,其uniqueItemFulfillmentCenterid = 7412

根据我的数据库中的数据,此查询的结果应该是两个产品。产品编号105和239.

这是我正在使用的Eloquent代码:

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

出于某种原因,这只返回产品ID 105,而不是105和239.此函数生成的sql为:

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生成错误,还是我误用了orWhereHas方法?对我来说,看起来OR语句在sql中没有正确放置。

如果我删除orWhereHas方法,事情会按预期工作。例如,如果我运行它:

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

我正确地取回了产品ID 105.如果我运行这个:

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

我正确地返回了产品ID 239.因此查询的各个部分正常工作,但是当我尝试将它们与orWhereHas组合时,我得到了意想不到的结果。知道为什么吗?

修改

根据评论,看起来这是一个错误。我可以通过重写代码来暂时解决它,以使用whereorWhere。这是临时解决方案:

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

1 个答案:

答案 0 :(得分:3)

这是一个错误,现在通过此PR https://github.com/laravel/framework/pull/8171

修复

自版本 5.0.21

以来一切正常