【问题标题】:Convert sql script to eloquent将 sql 脚本转换为 eloquent
【发布时间】:2018-09-28 13:56:09
【问题描述】:

最近我在使用 PHP Laravel 和 PostgreSQL,但我不知道如何将这个 sql 脚本转换为 eloquent。

SELECT v_extensions.extension, 
( 
    SELECT COUNT(v_xml_cdr.uuid) FROM v_xml_cdr WHERE v_xml_cdr.extension_uuid = v_extensions.extension_uuid AND start_stamp >= @startDate AND end_stamp <= @endDate
) 
FROM v_extensions ORDER BY count DESC LIMIT 1

我正在尝试做这样的事情,但我不知道如何写出来自 XmlCdr 的 extension_uuid 等于来自 Extension 的 extension。这些列也没有通过数据库上的外键链接。

$call = Extension::select('extension', function(){
        XmlCdr::where('extension_uuid', )
    })->limit(10)->get();

找到了一种使用DB::select的方法

$query = 'SELECT v_extensions.extension, (SELECT COUNT(v_xml_cdr.uuid) FROM v_xml_cdr WHERE v_xml_cdr.extension_uuid = v_extensions.extension_uuid) FROM v_extensions LIMIT 1';
$result = DB::select($query);

【问题讨论】:

  • 你为什么不改用\DB::raw()
  • @AzisAbdulBachar 我做了这样的事情` $all = DB::table('v_extensions')->select('extension, (SELECT COUNT(v_xml_cdr.uuid) FROM v_xml_cdr WHERE v_xml_cdr.extension_uuid = extension_uuid AND start_stamp >= @startDate AND end_stamp get(); ` 但它在我使用点('.')的地方抛出错误
  • @AzisAbdulBachar 用 DB::select() 做到了

标签: php laravel laravel-5 eloquent laravel-5.5


【解决方案1】:

首先,Eloquent 是一个 ORM。要使用它,您必须创建扩展 Eloquent 模型 model docs 的模型并定义它们的关系 relations docs

假设你做到了,你应该有这样的东西:

class ExtensionCDR extends \Illuminate\Database\Eloquent\Model
{
    protected $primaryKey = "uuid";      // primary key column name
    protected $table      = "v_xml_cdr"; // by default Eloquent assumes your table has the same name as the class - more or less

    // add relations like
    public function extensions()
    {
        return $this->hasMany(Extensions::class); //further parameters may needed - see docs
    }
}

class Extensions extends \Illuminate\Database\Eloquent\Model
{
     protected $table = "v_extensions";

     // add relations
}

有了这个,你可以做到这一点(基本上在任何地方): (我不确定哪个表有相关的时间戳)

// this is the case where the timestamps are on the related model
$result = ExtensionCDR::whereHas('extensions', function ($query) use($start, $end) {
    return $query->whereDate('start_stamp', '>', $start)
                 ->whereDate('start_stamp', '<', $end);
})->get();

我知道这不是一个完美的(复制/意大利面)答案,但我希望它能引导您朝着正确的方向前进; 万一我完全误解了你,只需使用带有原始查询的数据库模块,如下所示:raw things

【讨论】:

  • 是的,但是在 $query->whereDate() 里面应该是另一个 where('extensionId',EXTENSIONID from ExtensionCDR 模型)。而且我不知道如何从 ExtensionCDR 输入 EXTENSIONID
  • 该部分由关系处理,它是用 fkeys 定义的,默认使用它们;基本上通过使用whereHas,外键限制是在后台通过露水插入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
相关资源
最近更新 更多