【问题标题】:How to convert this SQL Query into Eloquent?如何将此 SQL 查询转换为 Eloquent?
【发布时间】:2021-06-15 10:14:31
【问题描述】:

我有这个 SQL,它将返回所有转换后的货币汇率的作业,并且它运行良好,但由于我们使用 API 资源,我们必须使用 Eloquent 模型才能像我们配置的那样获取响应数据。

  select * from (
        select 
        jr.id,
        title,description,
        FORMAT(jr.amount,2) as base_amount,
        c.symbol as base_currency,
        FORMAT(IFNULL(jr.amount * currency_rate.rate,jr.amount),2) as amount,
        jr.created_at,
        user_id,type,country_id,city_id,
        delivery_hours,deleted_at
        from job_requests as jr
        left join currencies as c on c.id = jr.currency_id
        left join currency_rates as currency_rate on ((currency_rate.from_currency = c.symbol AND currency_rate.to_currency = "QAR"))
    ) as job_requests order by amount desc ;

我可以写这个

$jobRequests = JobRequest::from('job_requests')->select("job_requests.id", "title", "description", DB::raw("format(job_requests.amount, 2) as base_amount"), "c.symbol as base_currency", DB::raw("format(ifnull(job_requests.amount * currency_rate.rate, job_requests.amount),2) as amount"), "job_requests.created_at", "user_id", "type", "country_id", "city_id", "delivery_hours", "deleted_at")
    ->leftJoin("currencies as c", function($join){
        $join->on("c.id", "=", "job_requests.currency_id");
    })
    ->leftJoin("currency_rates as currency_rate", function($join){
        $join->on('currency_rate.from_currency','=','c.symbol');
        $join->where('currency_rate.to_currency', 'TRY');
        #$join->on('currency_rate.to_currency', '=', DB::raw("c.symbol"));
    })

但我不知道如何将所有这些放在另一个 JobRequest 模型中,以便我可以使用子句进行各种排序。

【问题讨论】:

  • 什么是JobRequest?如果它是 Eloquent 模型,它已经有一个关联的表,因此不需要from()。此外,leftJoin()s 通常实现为关系函数。你现在也可以使用一个简单的DB::table('job_requests')->select()...(虽然它不适合 Eloquent 模型,而是一个普通的 php 对象)
  • 这是一张雄辩的桌子。我不能使用 DB:: 因为如果我这样做,我将无法使用诸如 $job->user->resumes 之类的东西
  • 我正在尝试做类似的事情stackoverflow.com/a/53023796/10602851

标签: php mysql laravel eloquent


【解决方案1】:

通过正确实施eloquent relationships,您可以执行$jobRequests[0]->currency->currencyRate

class JobRequest extends Model
{
    public function currency()
    {
        return $this->belongsTo(Currency::class);
    }
}
class Currency extends Model
{
    public function currency_rate()
    {
        return $this
            ->belongsTo(CurrencyRate::class, 'from_currency', 'symbol')
            ->where('currency_rate.to_currency', 'TRY');
    }
}

【讨论】:

  • 我们必须在查询本身中进行大量转换。这就是像这样工作时的问题。我已经在我们的项目中实现了大多数类似的东西,除了这个!无论如何,我们可以像我在帖子中提到的那样将其写为子查询吗?
  • 在您的帖子中没有子查询。只有连接。您需要进行哪些无法完成的转​​换?
  • 请参阅计算。我们必须将所有 Job Amount(例如 10000 条记录)转换为用户指定的货币,然后必须过滤它们,使用新的汇率对其进行排序。
  • 我仍然看不到您的问题,抱歉。您可能需要使用accessors 进行一些转换,而其他转换可以使用DB::raw() 来完成
  • 转换必须在返回数据之前完成。我的意思是在 MySQL 本身。这就是我想要达到的目标。我现在需要的只是将那个雄辩的查询放入另一个雄辩的查询中,但我不知道如何
猜你喜欢
  • 2021-09-11
  • 2021-10-04
  • 1970-01-01
  • 2013-01-08
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多