多对多和Eager加载查询

时间:2014-10-20 10:27:25

标签: laravel laravel-4 eloquent

我是Laravel的新手,我能够查询多对多关系。其中' template_dynamic'是两个表格的模板'模板'和'动态'。

// Template Model
class Template extends Eloquent
{
    protected $table = 'template';
    protected $guarded = array('template_id');
    protected $primaryKey = 'template_id';

    public function dynamic()
    {
        return $this->belongsToMany('dynamic', 'template_dynamic')
            ->select('*')
            ->withPivot('template_dynamic_id')
            ->orderBy('template_dynamic_html_sort', 'ASC');
    }

这里我能够检索记录

// Template Controller
$dynamic_fields = Template::find($rec->template_id)->dynamic;

我现在要做的是,数据透视表有很多属性&template_dynamic_option'。我如何查询记录并将其与$ dynamic_fields变量结合起来?

// What I want to do is something like this. But sadly this is an invalid syntax
$dynamic_fields = $dynamic_fields->with('template_dynamic_option');

欢迎任何建议或改进。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

首先,我很确定您的关系查询中不需要select('*')

但是让我们来解决你的实际问题;)

在Eloquent中访问数据透视表非常简单。

$dynamic_fields = Template::find($rec->template_id)->dynamic;

foreach($dynamic_fields as $dynamic){
    var_dump($dynamic->pivot)
}

但事情是,默认情况下,只有数据透视表的键存在于对象中。 要更改它,您必须使用withPivot()定义它们。实际上就像你已经做过但没有id。

public function dynamic()
{
    return $this->belongsToMany('dynamic', 'template_dynamic')
        ->withPivot('template_dynamic_option')
        ->orderBy('template_dynamic_html_sort', 'ASC');
}

如果您有多个其他列,请使用以下语法:

->withPivot('template_dynamic_option', 'foo', 'bar');