【问题标题】:Laravel 5.4 struggling with relationshipsLaravel 5.4 在人际关系中挣扎
【发布时间】:2017-08-20 10:50:52
【问题描述】:

我需要 Laravel 5.4 关系方面的帮助。

我有 4 张桌子:

用户(文件:id、名称等)

个人资料(字段: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');
}

订单项:

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.

在我的订单模型中:

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

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

在我的控制器中,我尝试了: 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 where products.order_item_id = 1 和 products.@ 987654331@ 不为空限制 1)

【问题讨论】:

    标签: laravel-5 relationship


    【解决方案1】:
    1. 你可以的

      Profile::where('user_id', $order->user_id)->first();
      
    2.  Order::with('order_items.product')->find($order->id);
      

    这应该适合你

    【讨论】:

    • 谢谢,但是对于产品订单,我收到此错误:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'products.order_item_id' in 'where Clause' (SQL: select * from products 其中products.order_item_id 在 (1, 2))
    【解决方案2】:
    1. 您无需在视图中执行任何操作。

    在您的订单模型中,您需要像这样创建与用户表的关系:

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

    鉴于您只需要编写如下内容: {{ $order->user->profile->fullName() }}

    1. 如果您没有提到product 和orderItems 之间的关系。对于您上面提到的关系,products 表必须有一个order_item_id 列。那么只有这句话就足够了:

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

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

    $items = $order->order_items

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

    【讨论】:

    • 谢谢,我不明白为什么我需要在 products 表中添加 order_item_id。 products 表有 id,order_items 表有 product_id,这是关系。 $order->order_items 没有返回商品名,如何获取商品名?
    • 好的,设法让它工作:在我的产品模型中,我有一个 orderItem,在我的 OrderItem 中,我有属于产品。现在 $order->order_items 也给了我产品名称。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2018-01-22
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多