【发布时间】:2023-03-05 04:34:01
【问题描述】:
这个问题与this one有关,但我把我真正的问题简化了太多。所以我创建了一个单独的问题:
我有两张桌子。一个以天为单位的间隔与名称相关联,例如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);
}
}
【问题讨论】:
-
如果涉及两个表,创建视图模型可能是更好的解决方案。检查:github.com/spatie/laravel-view-models
标签: php mysql laravel eloquent