【问题标题】:Laravel - Four levels deep relationshipLaravel - 四级深度关系
【发布时间】:2021-05-05 00:03:31
【问题描述】:

我正在尝试在订单模型中映射用户和订单模型之间的关系。

一个订单有一个项目。该项目有一个团队,该团队有一个所有者/用户

关系有四个层次,如下所示:

订单 > 项目 > 团队 > 用户

我的数据库表如下:

应用\订单

id, 
project_id

应用\项目

id, 
name, 
team_id

应用\团队

id
name
user_id

应用\用户

id
name

我的订单模型:

class Order extends Model{
    function customer(){
      // trying to map the relationship here
    }
}

我想像下面这样访问客户:

 $order =  Order::find(1);
 echo $order->customer->name;

您能告诉我如何映射上述关系吗?

【问题讨论】:

  • 您在users 表上存储客户名称的位置?
  • 在用户表中。应用\用户

标签: php laravel eloquent relationship


【解决方案1】:

您可以通过在查询中包含以下连接来获取它:

$data = Order::select('orders.*')
    ->join('projects', 'orders.project_id', '=', 'products.id')
    ->join('teams', 'projects.projects_id', '=', 'teams.id')
    ->join('users', 'teams.teams_id', '=', 'users.id')
    ->get();

对于 Eloquent,您可以使用此 package

您可以定义更深层次的关系:
OrderbelongsToProjectbelongsTo团队belongsTo用户

class Order extends Model
{
    use \Znck\Eloquent\Traits\BelongsToThrough;

    public function customer()
    {
        return $this->belongsToThrough('App\User', ['App\Team', 'App\Project']);
    }
}

【讨论】:

  • 非常感谢。雄辩的软件包成功了。这个解决方案对我来说更理想,因为它返回 $order->customer 作为 User 对象的一个​​实例,所以它的所有关系都是可访问的。
【解决方案2】:

另一种方法是在模型中定义 belongsTo,方法是添加连接以直接到达用户表

class Order extends Model
{

    public function customer()
    {
        return $this->belongsTo(Project::class, 'project_id')
            ->join('team as t', 't.id', '=', 'projects.team_id')
            ->join('users as u', 'u.id', '=', 't.user_id')
            ->select(['u.id as uid','u.name','projects.id']);
    }

}

然后就可以直接从order对象中获取客户信息了

$order =  Order::find(1);
$order->customer->name;

或 通过热切的loding

$orders =  Order::with('customer')->get();

【讨论】:

  • 完美运行。唯一的缺点是 $order->customer 不是用户模型的实例,因此您无法访问其关系
  • @black_belt 是的,这是对这种关系的妥协
猜你喜欢
  • 2020-03-12
  • 2021-12-06
  • 1970-01-01
  • 2020-08-01
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多