gpt4 book ai didi

php - 如何在 Eloquent 模型中创建复杂的虚拟列?

转载 作者:行者123 更新时间:2023-11-29 05:50:47 24 4
gpt4 key购买 nike

这个问题与this one有关,但我简化了太多我真正的问题。所以我创建了一个单独的问题:

我有两张 table 。一个以天为单位的持有间隔与名称相关联,例如 bimonthly = 15,另一个列出周期性操作并与间隔相关联。

我想列出在纯 SQL 中很容易的下一个周期性操作:

SELECT *, DATE_ADD(updated_at, INTERVAL days DAY) AS next_action 
FROM periodic_actions
INNER JOIN intervals ON interval_id = intervals.id
HAVING next_action > NOW()

这是我的表格:

CREATE TABLE `intervals` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
`days` INT NULL,
PRIMARY KEY (`id`));

CREATE TABLE `periodic_actions` (
`id` INT NOT NULL AUTO_INCREMENT,
`interval_id` INT NOT NULL,
`name` VARCHAR(45) NULL,
`updated_at` TIMESTAMP NOT NULL,
PRIMARY KEY (`id`));

以及区间的内容:

+----+----------+------+
| id | name | days |
+----+----------+------+
| 1 | daily | 1 |
| 2 | monthly | 30 |
| 3 | annually | 365 |
+----+----------+------+

我想用 Eloquent 构建相同的查询,我可以在我的虚拟列 next_action 上使用 where:

Action::orderBy('next_action', 'asc')
->where('next_action', '>', Carbon::now())
->get()

我不能隐藏到我的模型中的最接近的是:

Action::join('intervals', 'interval_id', '=', 'intervals.id')
->select(['*', DB::RAW('DATE_ADD(updated_at, INTERVAL days DAY) AS next_action')])
->havingRaw(DB::RAW('next_action > NOW()'))->get();

当然我有这个基础模型:

class Action extends Model
{
protected $table = 'periodic_actions';

public function interval()
{
return $this->belongsTo(Interval::class);
}
}

最佳答案

解决方案 1:使用全局范围将字段添加到您的选择语句

虚拟列的一个问题是,如果您不阻止,Eloquent 会尝试更新它们。您可以将其从 $fillable 数组中排除并使用 global scope在您的模型中添加虚拟列,例如:

protected static function boot()
{
parent::boot();

static::addGlobalScope('next_action', function (Builder $builder) {
$builder->addSelect(DB::raw('DATE_ADD(updated_at, INTERVAL days DAY) AS next_action'));
});
}

您必须记住,这会将您的模型耦合到 MySQL,因为您使用的日期函数在 sqlite 等数据库中不起作用。

解决方案 2:使用 MySQL View

通常,当我有多个计算字段时,我所做的是创建一个 MySQL View 。使用您想要的所有计算字段创建 View ,然后您可以为该 View 创建一个新的 Eloquent 模型,而不必担心查询范围。

需要注意的是,您当然不能在此模型上使用创建/更新/删除,但如果您仅将该模型用于显示目的,那应该不是问题。

关于php - 如何在 Eloquent 模型中创建复杂的虚拟列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54556064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com