Laravel 4的关系Eloquent不起作用

时间:2015-02-18 18:15:01

标签: php laravel laravel-4 eloquent

我正在设置两个模型。我们假设我们有一个投资组合和portfolio_category表

表组合

id
cat_id
name
status

表portfolio_category

cat_id
cat_name

模型

class Portfolio extends \Eloquent {
    protected $fillable = [];   
    public function portfolio_category() 
    {
        return $this->hasMany('Portfolio_category');
    }
}

class Portfolio_category extends \Eloquent {
    protected $fillable = [];
    public function portfolio() 
    {
        return $this->belongsTo('Portfolio');
    }
}

我的代码:

$data = Portfolio::all();
foreach($data as $value){
    $id = $value['id'];
    $name = $value['name'];
    $cat_name = $value['cat_name'];
}

我想显示类别名称,但它显示空值。

我很困惑,出了什么问题?任何想法!!!

2 个答案:

答案 0 :(得分:0)

我得到了答案

$data = Portfolio::join('portfolio_category', 'portfolio_category.cat_id', '=', 'portfolio.cat_id')->get();
foreach($data as $value){
    $id = $value['id'];
    $name = $value['name'];
    $cat_name = $value['cat_name'];
}

答案 1 :(得分:0)

您的关系未正确定义。在您的代码中,您尝试将Portfolio定义为父级,将Portfolio_category定义为子级。但是,您的表的设置使得Portfolio_category是父级,而Portfolio是子级。基本上,包含外键的表(投资组合表具有portfolio_category的外键)应该在belongsTo端。

因此,代替投资组合hasMany portfolio_category和portfolio_category属于组合,它需要切换到portfolio_category hasMany投资组合和投资组合belongsTo portfolio_category。

此外,我假设为简洁起见删除了这些内容,但您的portfolio_category表中的表名和主键不符合Laravel约定,因此您需要在模型中指定这些属性。

您的模型应如下所示:

class Portfolio extends \Eloquent {
    protected $table = 'portfolio';
    protected $fillable = [];

    public function portfolio_category()
    {
        return $this->belongsTo('Portfolio_category');
    }
}

class Portfolio_category extends \Eloquent {
    protected $table = 'portfolio_category';
    protected $primaryKey = 'cat_id';
    protected $fillable = [];

    public function portfolios() 
    {
        return $this->hasMany('Portfolio');
    }
}

现在您可以通过以下关系访问相关表:

$data = Portfolio::with('portfolio_category')->get();
foreach($data as $value){
    $id = $value->id;
    $name = $value->name;
    $cat_name = $value->portfolio_category->cat_name;
}

有关Eloquent ORM的更多信息,可以找到文档here (L4.2)here (L5.0)