Laravel:如何使用hasMany函数急切加载特定列?

时间:2014-09-01 14:42:18

标签: php laravel laravel-4 eloquent

我想使用Eager加载从file_name表中获取idproducts_type列,但Laravel eager会加载一个空结果。但是,当使用belongsTo时(请参阅下面的类别关系),此技术可行。

我哪里出错了?或者,最不可能的是,hasMany关系存在一些问题吗?


控制器

private function getProducts($category){
    return Products::with(array(
    'types'=>function($q){
            $q->first();
        },//this returns empty array
    'categories'=>function($q)use($category){
            $q->where('name','LIKE',$category);
        }))->get()->toArray();//this returns the correct result
}

这些是

中的一些关系

产品型号

public function types(){
    return $this->hasMany('Types','product_id')->select(array('products_type.id','products_type.file_name'));
}//doesn't work

public function categories(){
    return $this->belongsTo('Categories','category_id')->select(array('categories.id','categories.name'));
}//this works

类型模型

public function products(){
    return $this->belongsTo('Products','product_id');
}

1 个答案:

答案 0 :(得分:1)

tldr; 您需要foreign key / primary key参与关系,才能被选中。

您的belongsTo有效,因为:

// Child belongsTo Parent
// so, when you select parent.id,parent.name, Eloquent can match fk-pk:
$child->parent_id == $parent->id;

hasMany不起作用,因为:

// Parent hasMany Child
$parent->id == $child->parent_id;

// now, when you select child.id,child.name, then:
$child->parent_id; // null, therefore Eloquent can't match the keys

所以,想象一下你只选择了belongsTo parent.name - 那么这也行不通。

话虽这么说,你做了查询,获取了正确的行,但是不允许Eloquent完成它的工作。