【问题标题】:How to convert query to Laravel Eloquent ORM如何将查询转换为 Laravel Eloquent ORM
【发布时间】:2019-12-09 14:31:48
【问题描述】:

这是我要转换为 Laravel eloquent ORM 的 SQL 查询。

SELECT v.product_id
  FROM (
      SELECT product_id, count(*) AS matches 
        FROM product where filter_id IN (2,4)
    GROUP BY product_id
  ) AS v
WHERE v.matches = 2

这是我尝试过的代码。它返回包含 2 或 4 的所有 filter_id。我想获得具有 filter_id 2 4 的 product_id

$filter = [2, 4];

 $products = 
OcProductFilter::with('product')
->whereHas('product', function ($query) use ($filter) {
      $query->whereIn('oc_product_filter.filter_id', array($filter));
    })->get();

这是OcProductFilter的型号

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class OcProductFilter extends Model
{
    public $timestamps = false;
    protected $primaryKey = 'product_id';
    protected $table = 'oc_product_filter';
    protected $fillable = ["filter_id", 'product_id'];
    protected $hidden = [];


    public function product()
    {
        return $this->belongsTo('App\OcProduct', 'product_id', 'product_id');
    }
}

这是 product_filter 表 table image

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    我会使用以下原始 MySQL 查询,它不需要任何子查询:

    SELECT product_id, COUNT(*) AS matches 
    FROM product
    WHERE filter_id IN (2, 4)
    GROUP BY product_id
    HAVING matches = 2;
    

    你更新的 Laravel/Eloquent 代码:

    OcProductFilter::with('product')
        ->select('product_id', DB::raw('COUNT(*) matches'))
        ->groupBy('product_id')
        ->whereIn('filter_id', [2, 4])
        ->havingRaw('matches = ?', [2])
        ->get();
    

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 2021-12-29
      • 2015-07-21
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2016-11-23
      相关资源
      最近更新 更多