【问题标题】:Laravel BelongsTo Through relationshipLaravel BelongsTo 通过关系
【发布时间】:2020-01-15 20:16:43
【问题描述】:

如何在 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');
}

我们如何建立关系?

Property BelongsTo Project through Category

public function project(){
     return $this->belongsToThrough('App\Project', 'App\Category');
}

编辑问题。

因为我想在我的应用程序上进行多租户,并且租户是 PORJECT。我想按项目分隔类别和属性。

CATEGORY 属于 PROJECT PROPERTY 属于 CATEGORY

所以我想通过 CATEGORY 建立 PROPERTY 和 PROJECT 之间的关系。 现在,我需要在 categoriesproperties 表上添加:project_id,我认为这不是正确的方法。

【问题讨论】:

  • 您遇到了哪个错误?
  • @LakhwinderSingh,belongsToThrough 不是 Laravel 的关系类型。我试图通过 hasOneThrough 关系遵循 Prafulla 的回答,但这不起作用。
  • 查看这个添加了belongsToThrough关系github.com/staudenmeir/belongs-to-through的包

标签: laravel laravel-5 eloquent relationship route-model-binding


【解决方案1】:

我认为您可以使用$project->category->property,因为您在项目和类别之间具有一对一的关系,并且类别和属性之间又是一对一的关系,除此之外,如果您想定义之间的关系通过你的项目和物业可以考虑has-one-throughrelaationship。

在项目模型中

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();
}

【讨论】:

  • 感谢您的回答,但在这种情况下,我不能使用 hasOneThrough 关系。这是错误。 SQLSTATE [42S22]:未找到列:1054 'where 子句'中的未知列'categories.property_id'(SQL:从properties 中选择计数(*)作为聚合,其中存在(从projects 内部连接categories 中选择* categories.id = projects.category_id 其中categories.deleted_at 为空,properties.id = @9876543@37@.property_id 和 @187654339@ 987654340@.deleted_at 为空,projects.deleted_at 为空)和properties.deleted_at 为空)
  • 您能告诉我,Property 和 Category 模型是如何关联的吗?
  • class Property extends Model { public function category() { return $this->belongsTo('App\Category'); } } class Category extends Model { public function project() { return $this->belongsTo('App\Project'); } }
  • 所以我想让 Property Model 通过 Category Model 拥有一个 belongsTo 项目模型
  • @LimSocheat 我只问外键,让我知道关联这两个表的外键
【解决方案2】:

您的属性belongsTo 不正确。属性属于类别。

public function category(){
    return $this->belongsTo('App\Category','category_id');
}

现在您可以从以下属性中获取项目:

{{ $property->category->project->project_attribute }} 

【讨论】:

  • 嗨扎希德,我更新了我的问题!我想构建一个多租户应用程序。所以我需要按 PROJECT 过滤 CATEGORY 和 PROPERTY。
  • 你正在得到你想要的东西。像这样使用有什么问题?你到底想做什么??
【解决方案3】:

你不能这样。如果要访问项目使用属性。然后根据您的要求检查我提到的以下步骤。

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,但你不能做到反向关系。

【讨论】:

    猜你喜欢
    • 2019-06-27
    • 2018-03-08
    • 2019-05-26
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    相关资源
    最近更新 更多