Laravel Eloquent ORM渴望加载。关系错误地返回null

时间:2014-10-20 09:31:38

标签: laravel eloquent eager-loading

我有一个雄辩的ORM关系定义如下:

ProductConfiguration

    public function product()
    {
        return $this->belongsTo('Excel\Products\Product');
    }

    public function currency()
    {
        return $this->belongsTo('Excel\Currencies\Currency');
    }

产品

    public function productConfigurations()
    {
        return $this->hasMany('Excel\Products\ProductConfiguration');
    }
    public function productType()
    {
        return $this->belongsTo('Excel\Products\ProductType');
    }

我希望如果我执行以下操作,我将加载指定产品类型的所有产品配置,相关产品,嵌套产品类型详细信息和产品配置货币

$results = ProductConfiguration::with(
            array(
                'product' => function($query) use ($product_type) {
                        $query->where('product_type_id' , $product_type);
                    },
                'product.productType',
                'currency'
            )
        )


            ->get();

但是返回的集合的“product”设置为NULL。货币关系存在,但产品关系不存在。我可以看到输出的SQL查询和选择产品的查询检索正确的产品,如果我将其直接粘贴到我的sql编辑器中

select * from `products` 
where `products`.`id` in ('12', '13') 
and `product_type_id` = '1'

我是否认为此查询的结果应该包含在我的收藏中,或者我的想法中存在一些明显的缺陷?

2 个答案:

答案 0 :(得分:1)

我讨厌将此作为答案发布,但由于我没有足够的代表发表评论,所以请先尝试一下:

$results = ProductConfiguration::with('product')->get();

dd($results->toArray());

看看你得到了什么,如果你得到一些数据,试试这个

$results = ProductConfiguartion::with(array('products' => function($query){
    $query->where('product_type_id' , $product_type);
})->get();

dd($results);

看看你得到了什么,如果你得到null:你的$ product_type变量可能是你没想到的,所以试试dd($ product_type)以确保它符合你的期望。

答案 1 :(得分:1)

我认为你不想实现这一目标。现在,您得到的所有ProductConfiguration products只有certain_type

因此,如果您的某些配置具有product的其他类型,则您将获得null,因为您将product的结果限制为仅限于具有特定产品类型的结果。

我可能错了,但您可能希望获得ProductConfiguration属于Product的{​​{1}}类型certain_type。在这种情况下,您应该使用whereHas

$results = ProductConfiguration::
          with('product', 'product.productType', 'currency')->
          whereHas('product', function($q) use ($product_type)
          {
            $q->where('product_type_id', '=', $product_type);

          })->get();