首页 > 解决方案 > 作为中间表创建的项目表的 Eloquent Relation

问题描述

我有 3 张桌子 - 书籍、订单、物品

我将订单数据(order_id,user_id)保存在订单表中,并且书籍 ID 保存在 Items 表中,因为用户可以添加多本书。

图书

+++++++++++++++++++++++++++++
+ id    book_code    name   +
+++++++++++++++++++++++++++++
   1     abc         Book 1
   2     def         Book 2

命令

+++++++++++++++++++++++++++++
+ id  user_id               +
+++++++++++++++++++++++++++++ 
  1    1

项目

++++++++++++++++++++++++++++++++++
+ id order_id book_id  quantity  +
++++++++++++++++++++++++++++++++++
  1    1        1         2
  1    1        2         3

我正在尝试显示在订单 ID 下预订的订单详细信息和书籍,但我对使用这些关系感到困惑。由于所有数据都存储在 Order 表中,因此我能够成功显示订单详细信息。但我无法显示订购到相应订单 ID 的书籍

样板书

public function items()
{
    return $this->hasMany(Items::class);
}

模型订单

public function items()
{
    return $this->hasMany(Items::class,'order_id');
}

控制器

public function user_order_details($payment_orderid)
{
    // dd($payment_orderid);  //payment_orderid  = 1
    $order_details = Orders::find($payment_orderid);
    $order_products = Orders::find($payment_orderid)->items;
    $books = Books::with('items')->get();
    dd($books);
}

路线

Route::get('orders', 'UserDashboardController@user_order');  // I will be fetching the user orders based on the ID from Orders table
Route::get('orders/{payment_orderid}', 'UserDashboardController@user_order_details'); // Here I would like to show the details related to the order 

我能够获取结果,但我不确定如何将结果隔离到 order_id。

如果我的数据库实现错误且不可扩展,我愿意接受建议。

简而言之,我正在尝试显示相应订单的书籍详细信息

在此处输入图像描述

注意:如果投反对票,请务必评论原因。对于过去的几个问题,我无缘无故地被否决了

标签: phpsqllaraveleloquent

解决方案


首先,您不需要Order第二次查询,因为您已经在上面的行中得到了它,即

$order_details = Orders::find($payment_orderid);
$order_products = Orders::find($payment_orderid)->items;

可:

$order_details = Orders::find($payment_orderid);
$order_products = $order_details->items;

其次,如果您想获得books订单,您可以belongsToManyOrder模型上建立hasOne关系或在模型上建立关系Items(或两者兼而有之)。

属于许多人

将以下内容添加到您的Orders模型中:

public function books()
{
    return $this->belongsToMany(Books::class, 'items')
        ->withPivot('quantity')
        ->withTimestamps();
}

然后在您的控制器中,您可以执行以下操作:

$order_details = Orders::find($payment_orderid);
$books = $order_details->books; //Each book with have a `pivot` property than contains  the  quantity.

有一个

在您的Items模型中,您可以添加以下内容:

public function book()
{
    return $this->hasOne(Books::class);
}

然后在您的控制器中,您可以使用预先加载来获取项目和书籍:

$order_details = Orders::with('items.book')->find($payment_orderid);
$order_products = $order_details->items; 

在上面每个order_product都会有一个books属性,即

foreach ($order_products as $order_product) {
    $order_product->book->name;
}

推荐阅读