【问题标题】:Using Eloquent in Laravel for more advanced DB queries在 Laravel 中使用 Eloquent 进行更高级的数据库查询
【发布时间】: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');
}    

感谢您提出的所有建议。 马特

【问题讨论】:

    标签: php laravel eloquent


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-16
      • 2014-01-31
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多