在 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 在模型中应用语句

Laravel:在 API 测试中使用 Eloquent 模型

Laravel 5 / Eloquent - 对属于多的关系进行查询过滤