Laravel 5.4与人际关系挣扎

时间:2017-03-27 16:07:29

标签: laravel-5 relationship

我需要Laravel 5.4关系的帮助。

我有4张桌子:

用户(fileds:id,name等)

个人资料(字段:id,user_id,first_name,last_name)

订单(字段:id,user_id等) order_items(字段:id,order_id,product_id等)

用户可以拥有一个个人资料

个人资料可以有一个用户

用户可以拥有多个订单

订单有一个用户

订单可以包含多个商品

在我的模特中:

用户:

public function profile()
{
    return $this->hasOne('App\Profile');
}

public function orders()
{
    return $this->hasMany('App\Order');
}

资料:

public function user()
{
    return $this->belongsTo('App\User');
}

订单:

public function user()
{
    return $this->hasOne('App\User');
}

public function order_items()
{
    return $this->hasMany('App\OrderItem');
}

OrderItem的:

public function order()
{
    return $this->belongsTo('App\Order');
}

public function product()
{
    return $this->hasOne('App\Product');
}

我有两个问题:

1。 当我显示订单时,我想显示配置文件表中的first_name和last_name列。

在我的控制器中,我这样做了: $ user = User :: find($ order-> user_id);

在我看来: {{$ user-> profile-> fullName()}}

有没有办法直接在视图中获取名称而不是首先在控制器中获取用户?

2

在我的订单模型中:

当我查看订单时,我想显示每个商品的所有订单商品和商品名称(产品 - >名称)。

我很困惑,不知道该怎么做。

在我的控制器中我尝试过: 1。

$items = Order::find($order->id)->order_items->with('product');

出错:尝试获取非对象的属性

2。     $ items = Order :: find($ order-> id) - > order_items;

    foreach($items as $item) {
        echo $item->product->name;
    }

出现错误:

SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'products.order_item_id'(SQL:select * from products其中productsorder_item_id = 1和productsorder_item_id不是空限制1)

2 个答案:

答案 0 :(得分:0)

  1. 您无需查看任何内容。
  2. 在订购模型中,您需要与用户表创建关系,如下所示:

    public function user(){
        return $this->belongsTo(User::class);
    }
    

    在视图中你只需要写这样的东西: {{ $order->user->profile->fullName() }}

    1. 如果您还没有提到product和orderItems之间的关系。对于您上面提到的关系,products表必须有order_item_id列。那么只有这个陈述就足够了:
    2. $items = Order::find($order->id)->order_items

      或者我建议使用以下行而不是上面的

      $items = $order->order_items

      因为您已经拥有$order对象,因此您无需再次使用id进行查询。

答案 1 :(得分:0)

  1. 你可以做到

    Profile::where('user_id', $order->user_id)->first();
    
  2. 待办事项

     Order::with('order_items.product')->find($order->id);
    
  3. 这应该对你有用