php - 作为中间表创建的项目表的 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。
如果我的数据库实现错误且不可扩展,我愿意接受建议。
简而言之,我正在尝试显示相应订单的书籍详细信息
注意:如果投反对票,请务必评论原因。对于过去的几个问题,我无缘无故地被否决了
解决方案
首先,您不需要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;
}
推荐阅读
- excel - Excel countif公式两个条件
- spring-boot - Web应用程序Spring Boot中的“没有限定类型的bean”
- google-apps-script - 使用 Google Docs 的应用脚本检测超链接点击
- javascript - 如何根据图像使用 JS 制作动态横幅更改背景颜色?
- c++ - 我试图了解 xor 操作后指针变量发生了什么变化
- z3 - Z3 的“ctx-solver-simplify”和“ctx-simplify”之间的可满足性不一致
- java - 阿帕奇 POI。计算生成的(通过模板)DOCX文档页面的高度
- google-apps-script - 如果 isBlank 不起作用,你如何找到一个空单元格?
- emscripten - 如何使用 EM_JS 从 C++ 调用带有参数的 javascript 方法
- regex - 货币 preg_match_all