我正在嘗試使用 LaravelupdateOrCreate根據 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(從上個月開始存在)
預期輸出:記錄已更新
預期輸入:2(不存在或不在 2 個月內)
預期輸出:創建新記錄
更新:
使用建議的答案,
'id' => $request->get('id'),
'created_at' => \App\Models\Result::whereBetween('created_at', [
\Carbon\Carbon::now()->startOfMonth()->subMonthsNoOverflow(),
\Carbon\Carbon::now()->endOfMonth(),
]),
我收到錯誤:
類 Illuminate\Database\Eloquent\Builder 的物件無法轉換為字串
uj5u.com熱心網友回復:
干得好:
您只需要在方法的第一個引數中顯式定義運算子。
方法的第一個引數中陣列的每個元素都應該是一個包含三個引數的陣列。
列、運算子、值
$startDate = \Carbon\Carbon::now()->startOfMonth()->subMonths(2);
$endDate = \Carbon\Carbon::now()->endOfMonth();
$resultRow = \App\Models\Result::query()
->where('id', $request->id)
->whereBetween('created_at', [$startDate, $endDate])
->first();
\App\Models\Result::updateOrCreate(
[
[
'id', '=', $request->get('id'),
],
[
'created_at', '>=', $startDate,
],
[
'created_at', '<=', $endDate,
],
],
array_merge(
[
'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'),
],
$resultRow ? [] : [
'id' => $request->get('id'),
'created_at' => \Carbon\Carbon::now()
]
)
);
請注意,我在方法的第二個引數中重復了id&created_at列設定。這是因為與常規行為相反,如果沒有找到符合該標準的結果,則不會根據我的測驗執行 2 方法的引數陣列的合并。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367081.html
