繁体   English   中英

Laravel 8.x - 如何使用带有 where 子句的 updateOrCreate?

[英]Laravel 8.x - How to use updateOrCreate with a where clause?

我正在尝试使用 Laravel updateOrCreate根据 ID 是否存在来更新本月和上个月的记录。

\App\Models\Result::updateOrCreate(
        [
            'id' => $request->get('id'),
            // where created_at is within the last 2 months
            'created_at' => [
                '>',
                \Carbon\Carbon::now()->startOfMonth()->subMonthsNoOverflow()
            ],
        ],
        [
            'discipline_one' => $request->get('d-one'),
            'discipline_two' => $request->get('d-two'),
            'discipline_three' => $request->get('d-three'),
            'discipline_four' => $request->get('d-four'),
            'discipline_five' => $request->get('d-five'),
            'discipline_six' => $request->get('d-six'),
        ]
    );

如果 ID 存在,并且结果在当前月份或上个月,则创建新记录而不是更新记录。

预期输入:1(上个月存在)
预期 output:记录已更新

预期输入:2(不存在或不在 2 个月内)
预期 output:已创建新记录

更新:

使用建议的答案,

'id' => $request->get('id'),
'created_at' => \App\Models\Result::whereBetween('created_at', [
    \Carbon\Carbon::now()->startOfMonth()->subMonthsNoOverflow(),
    \Carbon\Carbon::now()->endOfMonth(),
]),

我得到错误:

Object 的 class Illuminate\Database\Eloquent\Builder 无法转换为字符串

这里是 go:

您只需要在方法的第一个参数中显式定义运算符

方法的第一个参数中数组的每个元素应该是一个包含三个 arguments 的数组。
列、运算符、值

$startDate = \Carbon\Carbon::now()->startOfMonth()->subMonths(2);
$endDate = \Carbon\Carbon::now()->endOfMonth();

\App\Models\Result::updateOrCreate(
    [
        [
            'id', '=', $request->get('id'),
        ],
        [
            'created_at', '>=', $startDate,
        ],
        [
            'created_at', '<=', $endDate,
        ],
    ],
    [
        'discipline_one' => $request->get('d-one'),
        'discipline_two' => $request->get('d-two'),
        'discipline_three' => $request->get('d-three'),
        'discipline_four' => $request->get('d-four'),
        'discipline_five' => $request->get('d-five'),
        'discipline_six' => $request->get('d-six'),
    ]
);

尝试将您的条件更改为

$start = \Carbon\Carbon::now()->startOfMonth()->subMonths(2);
$end = \Carbon\Carbon::now()->endOfMonth();

$condition = \App\Models\Result::whereBetween('created_at', [$start, $end]);

\App\Models\Result::updateOrCreate(
        [
            'id' => $request->get('id'),
            // where created_at is within the last 2 months
            'created_at' => $condition,
        ],
        [
            'discipline_one' => $request->get('d-one'),
            'discipline_two' => $request->get('d-two'),
            'discipline_three' => $request->get('d-three'),
            'discipline_four' => $request->get('d-four'),
            'discipline_five' => $request->get('d-five'),
            'discipline_six' => $request->get('d-six'),
        ]
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM