使用upsert Laravel后获取插入和更新的行

u7up0aaq  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(162)

当我使用upsert函数时,我想得到插入和更新的行,我应该怎么做?
任何想法对我来说都很重要。非常感谢!
我使用MySQL。
下面是我的示例代码:

Flight::upsert([
    ['departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99],
    ['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150]
], ['departure', 'destination'], ['price']);

我试过很多方法,但都不管用。

$dtbClass->upsert($this->items->toArray(), ['JAN'], $this->headings);

// Get records after upsert
$result = $dtbClass->whereIn('JAN', $this->janList)->get();

$classIds = $result->pluck('id')->toArray();

// check any class was created
$checkCreatedClass = false;
$checkUpdatedClass = false;
foreach ($result as $class) {
    if ($checkCreatedClass && $checkUpdatedClass) {
       break;
    }
    if ($class->wasRecentlyCreated) {
       $checkCreatedClass = true;
    } elseif ($class->wasChanged()) {
       $checkUpdatedClass = true;
    }
}
ycl3bljg

ycl3bljg1#

看起来Laravel不能返回受upsert()方法影响的行,但你可以在更新/插入的项目中添加一些标志。例如,updated_at列。类似于这样:

$updatedAt = Carbon::now();

Flight::upsert([
        ['departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99, 'updated_at' => $updatedAt],
        ['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150, 'updated_at' => $updatedAt]
    ], ['departure', 'destination', 'updated_at'], ['price', 'updated_at']);

$affectedFlights = Flight::where('updated_at', $updatedAt)->get();

注意:MySQL需要在第二个参数中使用的所有列上的唯一索引,以唯一地标识表中的记录。因此,您需要创建一个包含所有列('departure','destination','updated_at'在我的示例中)的复合唯一索引。
在我看来,这并不是解决问题的唯一方法,我只是把它作为例子之一,希望我能帮助你或给你正确的想法,祝你好运。

相关问题