php - Eloquent DB::Post->where()->update() 始终返回 1,无论进行任何更改

标签 php mysql laravel eloquent

我试图弄清楚如何在 eloquent 中正确编码 update() 函数,以根据表单中的用户输入返回 0 或 1。例如,如果我点击更新按钮而不进行任何更改,它会返回 1。它不应该返回 0 吗?

我尝试在 stackoverflow 中研究类似的解决方案,看看是否有人遇到与我面临的相同问题。但到目前为止还没有运气。我也尝试修改代码,但没有成功。

public function update(Request $request, $id)
{

    $UCPost = UCPost::find($id);

    $UCPost->gown_2019 = $request->input('Gown2019');
    $UCPost->gown_2017_2018 = $request->input('Gown20172018');
    $UCPost->gown_2016 = $request->input('Gown2016');
    $UCPost->gown_2015 = $request->input('Gown2015');
    $UCPost->Light_Blue = $request->input('LightBlue');
    $UCPost->Seconds = $request->input('Seconds');
    $UCPost->Velveteen = $request->input('Velveteen');
    $UCPost->Velveteen_discolored = $request->input('Velveteen_discolored');
    $UCPost->Rental = $request->input('Rental');
    $UCPost->Rentals_Out = $request->input('Rentals_Out');
    $UCPost->Rentals_Left = $request->input('Rentals_Left');
    return $UCPost->where('id', $id)->update(
        [
            'gown_2019' => $UCPost->gown_2019,
            'gown_2017_2018' => $UCPost->gown_2017_2018,
            'gown_2016' => $UCPost->gown_2016,
            'gown_2015' => $UCPost->gown_2015,
            'Light_Blue' => $UCPost->Light_Blue,
            'Seconds' => $UCPost->Seconds,
            'Velveteen' => $UCPost->Velveteen,
            'Velveteen_discolored' => $UCPost->Velveteen_discolored,
            'Rental' => $UCPost->Rental ,
            'Rentals_Out' => $UCPost->Rentals_Out,
            'Rentals_Left' => $UCPost->Rentals_Left
        ]

    );
}

上面的代码正如我之前提到的,无论对表单进行任何更改,它总是返回 1。如果用户没有进行任何更改或者他们不小心点击了更新按钮,我希望它返回 0。我正在尝试在 Eloquent 中找到 mysqli_affected_rows 的等效项。

最佳答案

您正在模型上调用 update() 方法。如果更新成功,将返回 1。是否进行任何更改并不重要,成功更新后始终为 1。

如果您只想在发生更改时保存到数据库,则可以使用 save() 方法,该方法会检查是否存在更改,并且仅写入数据库如果数据不同。您已经创建了代码来执行此操作,通过将模型设置为包含工作表中的所有新数据,因此最后有一个简单的 save() (检查是否保存) ,会做你想做的事。

但是,您当前的代码正在执行大量额外工作。您将所有变量分配给模型,然后根据模型的数据分配进行更新。您不必在更新方法中再次执行所有分配。设置字段后,可以立即保存,无需重新分配所有变量。所以:

$UCPost->gown_2019 = $request->input('Gown2019');
// etc..
$UCPost->Rentals_Left = $request->input('Rentals_Left');

$UCPost->save();

将带您到达您想去的地方,并且仅在不同的情况下才会保存。

如果您可以控制表单,并且可以更改表单元素名称以匹配您的数据库,那么这可能会更容易。您可以在一行中完成所有这些操作:

$UCPost->update($request->all());

如果你想检查模型是否脏,只需调用 isDirty():

if($UCPost->isDirty()){
    // changes have been made
}

最后,如果您想验证在任一方法(保存或更新)之后是否有任何更改:

if ($UCPost->wasChanged()) {
    // changes have been made
}

希望这有帮助

关于php - Eloquent DB::Post->where()->update() 始终返回 1,无论进行任何更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56998708/

相关文章:

php - 如何使用 php 的 SimpleXML 获取 XML 的第一个标签的名称?

java - java和php之间的细微差别

php - Ajax/jquery 如何在不刷新页面的情况下从按钮单击发送数据

MySQL 数据库 |同时查询 count() 和 select

mysql - 不同表的结果求和,不存在则返回null

php - 如何为生产或子域系统创建 laravel 存储符号链接(symbolic link)?

php - 第一份工作完成后如何运行工作?

php - MySql查询随机id

php - 如何将请求实例从一个 Controller 函数传递到另一个 Controller 函数

php - Laravel 按动态 ID 数组对集合进行排序