在 Laravel 中使用 Eloquent 进行更高级的数据库查询
Posted
技术标签:
【中文标题】在 Laravel 中使用 Eloquent 进行更高级的数据库查询【英文标题】:Using Eloquent in Laravel for more advanced DB queries 【发布时间】:2014-11-05 17:06:33 【问题描述】:过去几个月我一直在开发一个 laravel 应用程序,这是我第一次使用该框架。这也是我第一次拥抱和使用 ORM(Eloquent)。
在大多数情况下,Eloquent 在执行基本的数据库操作时似乎非常简单。然而,当事情变得有点复杂时,我经常发现自己花费了太多时间试图弄清楚如何以 Eloquent 方式进行操作并跳到原始数据库查询。
希望有人能建议我是否应该使用 Eloquent 相当容易地在以下稍微复杂的查询中实现我想要的结果,或者我应该继续使用原始数据库查询。
表格:产品、用户、警报
警报有一个user_id
、一个product_id
和一个amount
,用户希望在此收到产品在特定价格下销售的警报。 p>
目前我正在使用原始数据库查询来获取所有警报:
SELECT p.*, u.firstname, u.lastname, u.email, a.amount AS alert_amount
FROM alerts AS a
JOIN dods AS d ON a.product_id = d.product_id
JOIN products AS p ON d.product_id = p.id
JOIN users AS u ON u.id = a.user_id
WHERE a.amount <= p.saleprice1
我的 eloquent 模型的建立关系如下
用户模型
public function alerts()
return $this->hasMany('Alert');
产品型号
public function alerts()
return $this->hasMany('Alert');
警报模型
public function product()
return $this->belongsTo('Product');
public function user()
return $this->belongsTo('User');
感谢您提出的所有建议。 马特
【问题讨论】:
【参考方案1】:要了解关系,您需要了解参考应该在表格中的什么位置。
警报模型与User
具有belongsTo()
关系,这表明alerts
表有一个名为user_id
的字段(通常是一个无符号整数),其中包含相关的用户ID。
用户模型与Alert
具有hasMany()
关系,这表明警报表包含上述引用。
一个用户有许多警报,建立了一对多的关系。
您可以将此关系与 eloquent 一起用于任何 CRUD 操作。
一些帮助你的例子
按用户检索所有警报
$alerts = User::find(1)->alerts()->get();
通过警报检索用户
$user = Alert::find(1)->user()->first();
插入针对用户的新警报
$alert = new Alert(["name" => "alert1"]);
$user = User::find(1);
$user->alerts()->save($alert);
删除与用户关联的所有警报
$user = User::find(1);
$user->alerts()->delete();
【讨论】:
酷。所以这有点像事情的基本方面。真的想弄清楚如何获得符合条件的警报,并包括与该警报相关的产品和用户。【参考方案2】:你只需要多对多关系:
// User model
public function products()
return $this->belongsToMany('Product')
->wherePivot('amount', '>=', DB::raw('products.salesprice1'))
->withPivot('amount');
// then
$user->products; // collection of products with price below alerts.amount
【讨论】:
不错。我会试一试,然后回复你。似乎是我要找的。span> 【参考方案3】:这实际上是我正在寻找的正确答案(关闭 http://laravel.io/forum 并感谢 @onecrush)。
$alerts = Alert::with(['product','user'])->whereHas('product', function($q)
$q->where('saleprice1', '<', DB::raw(alert.amount));
)->get();
【讨论】:
以上是关于在 Laravel 中使用 Eloquent 进行更高级的数据库查询的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel 中使用 Eloquent 多态关系对数据进行分类
laravel 在角色上使用 eloquent 驱动程序进行身份验证
如何在 Laravel 中使用 Eloquent 对 NULL 值进行最后排序
在 Laravel 中使用 Eloquent 在模型中应用语句