如何在Laravel中实现BelongsToThrough关系?
我有桌子:
**projects_table**
id
**categories_table**
id
project_id
**properties_table**
id
category_id
类别属于项目
public function project(){
return $this->belongsTo('App\Project');
}
财产属于类别
public function category(){
return $this->belongsTo('App\Category');
}
我们如何建立关系?
财产属于通过类别进行项目
public function project(){
return $this->belongsToThrough('App\Project', 'App\Category');
}
编辑问题。
因为我想对我的应用程序进行多租户,所以租户是PORJECT。我想按项目区分类别和属性。
CATEGORY属于PROJECT 属性属于CATEGORY
所以我想通过CATEGORY建立PROPERTY和PROJECT之间的关系。
现在,我需要在类别和 properties 表上都添加project_id
,我认为这不是正确的方法。
答案 0 :(得分:1)
我想您可以进行$project->category->property
,因为您要在Project和Category之间建立一对一的关系,而在Category和属性之间又具有一对一的关系,此外,如果您想定义一个通过您引起的项目与财产之间的关系,您可以考虑建立has-one-through关系。
在项目模型中
public function property()
{
return $this->hasOneThrough('App\Property', 'App\Category');
}
和属性模型中
public function property()
{
return $this->hasOneThrough('App\Project', 'App\Category');
}
可能是
在这种情况下,您也可以执行
之类的操作在媒体资源模型中
public function project()
{
return $this->category->project( or projects);
or if Category and properties have many-to-many relationship
you can do `return $this->categories->with('projects')->get();`
}
答案 1 :(得分:0)
您的属性belongsTo
不正确。财产属于类别。
public function category(){
return $this->belongsTo('App\Category','category_id');
}
现在您可以从以下属性中获取项目:
{{ $property->category->project->project_attribute }}
答案 2 :(得分:0)
您不能像这样。如果要访问项目的使用属性。然后按照我的要求检查以下步骤。
Category.php模型
public function project(){
return $this->belongsTo('App\Project','project_id','id');
}
Property.php模型,这里您做错了。您可以直接访问它,您必须首先与类别建立关系,然后从类别中获取项目。
属性属于类别
public function categories(){
return $this->belongsTo('App\Category','category_id','id');
}
现在,如果要从控制器访问它,则可以使用with();
$property = Property::with('categories.project')->first();
在这里您会得到$property->categories->project->name
注意::如果您想从项目中获取属性,则可以使用hasOneThrough
,但不能建立逆向关系。