- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下表格:
采购订单
行项目
产品
采购订单包含多个订单项,每个订单项有一个产品和一个数量字段('数量')。
这是我定义 Laravel 模型的方式:
产品型号:
class Product extends Model
{
public function lineitems()
{
return $this->hasMany('App\LineItem');
}
}
订单项模型:
class LineItem extends Model
{
public function purchase_order()
{
return $this->belongsTo('App\PurchaseOrder', 'purchase_order_id');
}
public function product()
{
return $this->hasOne('App\Product', 'product_id');
}
}
采购订单模型:
class PurchaseOrder extends Model
{
public function lineitems()
{
return $this->hasMany('App\LineItem');
}
}
我想获得所有 'line_items.qty' 的总和,用于通过 'purchase_order.status' 过滤的 'product.id' .
如何在 Model 函数 中编写查询,以便我可以使用它通过 Blade @foreach 遍历所有产品?
提前致谢!
最佳答案
如果你想获得更快的速度并一次获得所有内容,那么你可以尝试这个查询:
$products = Product::selectRaw('products.*, sum(line_items.qty) as qty_sum')
->join('line_items', 'line_items.product_id', '=', 'products.id')
->join('purchase_orders', 'purchase_orders.id', '=', 'line_items.purchase_order_id')
->where('purchase_orders.status', 'sold')
->groupBy('products.id')
->get();
但如果 MySql,则您的数据库必须接受一列始终与其他列匹配的整个分组。
但是如果你只想坚持使用 Laravel 关系,请执行以下步骤。
1-当你的表名是复数时,PK是id
,FK是单数表名,_id
ex (table products(id), table line_items(product_id )), 关系中不需要指定外键。
2- 因为是多对多的情况,你不一定要为中间表 line_items
定义一个模型,你可以用它来进行特殊和快速的查询,但是你可以通过 Laravel Pivot 系统在其上处理 CRUD。您可以了解有关 Pivot 的更多信息 https://laravel.com/docs/5.7/eloquent-relationships#many-to-many
Retrieving Intermediate Table Columns
As you have already learned, working with many-to-many relations requires the presence of an intermediate table. Eloquent provides some very helpful ways of interacting with this table. For example, let's assume our User object has many Role objects that it is related to. After accessing this relationship, we may access the intermediate table using the pivot attribute on the models:
所以你的模型看起来像这样:
产品型号:
class Product extends Model
{
public function purchaseOrders()
{
return $this->belongsToMany('App\PurchaseOrder', 'line_items')->withPivot('qty')->withTimestamps();
}
public function soldPurchaseOrders()
{
return $this->belongsToMany('App\PurchaseOrder', 'line_items')
->where('status', 'sold')
->withPivot('qty')->withTimestamps();
}
}
采购订单模型:
class PurchaseOrder extends Model
{
public function products()
{
return $this->belongsToMany('App\Product', 'line_items')->withPivot('qty')->withTimestamps();
}
}
使用 ->withPivot('field1', 'field2', 'etc')
和 ->withTimestamps()
如果你的数据透视表有 created_at
, updated_at
列。并在查询构建器中使用前缀 pivot_
+attribute 访问 pivot 值,并在结果对象方法中使用 pivot->
+attribute,例如:$products->first( )->pivot->qty
.
如果您仍想使用 LineItem 模型,则将 Product 关系更改为 belongsTo
。
订单项模型:
class LineItem extends Model
{
public function purchaseOrder()
{
return $this->belongsTo('App\PurchaseOrder');
}
public function product()
{
return $this->belongsTo('App\Product');
}
}
3- 最后使用以下代码检索数量为 SUM 的产品:
使用预先加载在 1 个请求中同时自动加载所有产品的采购订单,以避免 N-Products + 1 请求到数据库。 https://laravel.com/docs/5.7/eloquent-relationships#eager-loading
$products = Product::with('soldPurchaseOrders')->get();
foreach($products as $product) {
$qtySum = $product->soldPurchaseOrders->sum('pivot.qty');
echo '<br/> Product '.$product->id.' - '.$product->name.' - '.$qtySum;
}
所以最后,Laravel 将像上面的第一个示例一样使用 INNER JOIN 查询转换它,但只使用花哨的设计和数据透视表。
编辑------
在 OP 将订单状态指定为 sold
后,我更新了代码以使用 sold。
编辑 2 -----
将 $product->pivot->qty
替换为 $qtySum
。在调用 soldPurchaseOrders
关系后,数据透视数量将可用,例如:
foreach($product->soldPurchaseOrders as $order) {
echo '<br/>Order .'$order->id.' - '.$order->pivot->qty;
}
关于php - 在 Laravel Eloquent 中获取由父模型中的字段过滤的相关列的 SUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54956377/
我是 Laravel 的新手,我正在处理我的数据库迁移。对于一个表,我在表定义中包含了 $table->timestamps() 快捷方式。令我沮丧的是,我发现在我为表设置种子后,created_at
我有一个任务需要显示每种类型的假期,其中 id 是奇数。当我尝试在 Eloquent 中执行它时,它总是给我一个错误。 查询 Select holiday_type.id, holiday_type.
我有一个任务需要显示每种类型的假期,其中 id 是奇数。当我尝试在 Eloquent 中执行它时,它总是给我一个错误。 查询 Select holiday_type.id, holiday_type.
好的,我有型号 A链接到许多模型 B , 所以型号 A有一个 hasMany与模型的关系 B和型号B有一个 belongsTo与模型的关系 A . 但是,在所有这些中B有一个特定的,例如具有较高值的
如何应用 Laravel 的 Eloquent whereIn() 以便它包含 null? 我已经尝试过: User::whereIn("column", [null, 1, 2]) -> get()
我有一张库存变动表,其中显示了产品的历史记录(接收、移动位置等) 我有两个计算(通过总和)的查询: 原收到数量。 当前的实时数量(在事物被移动之后)。 这两个查询都返回相同模型的集合。它们将始终具有相
我一直在研究 Slim 2,最近才开始部署到生产服务器。到目前为止,一切似乎都运行正常。我能够登录,所以我知道我正在连接到数据库就好了。它识别出我登录的人,识别出我作为该用户拥有的权限。我有另一个表有
我在 Eloquent 中使用 orWhere 时遇到问题。 我有一个团队,这个团队有一些资料。我想获取状态 = 1 或状态 = 2 的所有配置文件。但我无法让它工作。 我的代码是这样的: $prof
在 Zizaco/entrust的 Laravel Entrust,如何设置与 Eloquent 的 Entrust 类关系,以便获得角色拥有的权限列表,如下所示: // get admin role
我想为我的两个表创建一个汇总报告,一个是员工表,另一个是 sims 表。这些表具有一对多的关系。我知道我们可以通过使用导出模型的数据->fromModel($model)但是有没有办法让我可以根据这两
我有两个模型,一个是扩展 Jenssegers\Model 的 mongo 模型,另一个是扩展 Illuminate\Model 的 sql 模型。这个 sql 模型没有定义连接名称,因为我们有多个数
我有两个多对一关系的模型: class Meal extends \Eloquent { /** * public Integer $id; - primary key
到目前为止,Vue2 对我来说读起来非常好,但除了这一点我很难调试。 Shop-show.vue ..... ..... {{shop.user.id}} .....
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 2 年前。 Improve this q
我需要获取第二个表的 ID。我无法避免使用 INNER JOIN,因为我必须按第二个表中的列对结果进行排序。 这是我的两张 table events id name .... date
我正在尝试为我的用户提供 Laravel hiscores 分页表的排名数字。 这是我发现有效的 MySQL 查询。我正在尝试将其作为 Laravel Eloquent 查询来使用。 select @
我的产品模型上有这种关系。 public function productInventory(){ return $this->hasOne('App\Models\Ecommerce
我正在尝试在 Laravel 5.5 应用程序中为一个包含关系数据的表添加种子。 我有这两个表/模型: 用户 问题 在 app\User.php 模型文件上;我有以下 hasMany 关系: publ
我重写了这个帮助请求,并简化了我试图尽量减少移动部件数量的内容。 我是一名经验丰富的 OOP 程序员,但这是我使用 LAMP、Laravel 或 Eloquent 的第一个项目。 我正在 Larave
我正在使用 Laravel 和 MongoDB (jenssegers/laravel-mongodb) 开发一个网络应用程序。 在使用 php artisan make:model 创建新模型时,命
我是一名优秀的程序员,十分优秀!