为了账号安全,请及时绑定邮箱和手机立即绑定

作为中间表创建的项目表的雄辩关系

作为中间表创建的项目表的雄辩关系

PHP
收到一只叮咚 2021-11-05 10:55:43
我有 3 张桌子 - 书籍、订单、物品我将订单数据(order_id,user_id)保存在订单表中,书籍 ID 保存在项目表中,因为用户可以添加多本书。图书++++++++++++++++++++++++++++++ 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 tableRoute::get('orders/{payment_orderid}', 'UserDashboardController@user_order_details'); // Here I would like to show the details related to the order 我能够获取结果,但我不确定如何将结果与 order_id 隔离。如果我的数据库实现错误且不可扩展,我愿意接受建议。简而言之,我正在尝试显示相应订单的书籍详细信息注意:如果投反对票,请确保您评论原因。对于过去的几个问题,我无缘无故地被否决了
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

首先,您不需要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订单,您可以belongsToMany在Order模型上建立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;

}


查看完整回答
反对 回复 2021-11-05
?
撒科打诨

TA贡献1934条经验 获得超2个赞

根据我的理解,您的项目表是订单和书籍的数据透视表。所以你可以做这样的事情:


订单模型


public function books()

{

    return $this->belongsToMany('App\Book', 'items', 

      'order_id', 'book_id');

}

items是数据透视表。


在控制器中:


public function user_order_details($payment_orderid)

{

    $order_details = Orders::find($payment_orderid);

    foreach ($order_details->books as $product)

    {

       echo $product->name;

    }

}


查看完整回答
反对 回复 2021-11-05
  • 2 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信