Laravel Eloquent 的 delete() 方法无效

11

文档表示:

$user = User::find($user_id);

$user->delete();

这段代码不起作用,但是ProductColor::find($color_id)可以正常工作。$color->delete()没有返回任何内容,DELETE FROM查询甚至没有执行(如调试栏所示)。

但我可以使用以下方法删除记录:

ProductColor::destroy($color_id);

可能是我之前忽略了什么,我对Laravel还不熟悉。

我也在使用store,它的工作效果符合预期。

public function store(Request $request)
    {
        $color = new ProductColor();
        $color->name = $request->color_name;
        $color->order = $request->color_order;
        $saved = $color->save();

        if ($saved) {
            return back()->with('message:success', 'Ok');
        } else {
            return back()->with('message:error', 'Error');
        }

    }

总之

这个方法有效

public function destroy($color_id)
    {
        $deleted = ProductColor::destroy($color_id);

        if ($deleted) {
            return back()->with('message:success', 'Deleted');
        } else {
            return back()->with('message:error', 'Error');
        }
    }

这是不正确的

public function destroy($color_id)
{
  $color = ProductColor::find($color_id);

  $color->delete();
}

我的模型

<?php

namespace Modules\Shop\Entities;

use Illuminate\Database\Eloquent\Model;
use Modules\Languages\Entities\Language;

class ProductColor extends Model
{
    protected $fillable = [];
    protected $table = 'product_colors';
}

真的,我不知道为什么这不起作用。但是你为什么不尝试使用查询呢?$user = User::where('user_id', $user_id)->delete(); - diakosavvasn
我的IDE显示'where'不是静态方法,所以我只使用了User::destroy($user_id); - RomkaLTU
当您尝试使用 delete() 时,出现了什么错误? - lesssugar
就像我说的那样,没有错误,什么也没有,它只是没有执行。 - RomkaLTU
6个回答

13

抱歉,我已经找到问题所在。是我的错误发布了这个问题。

我尝试做的事情:

$color = new ProductColor();
$color->find($color_id);
$color->delete();

应该是:

$color = ProductColor::find( $color_id );
$color->delete();

我的问题是我担心IDE会抱怨使用非静态方法 'find'。


3
第一个例子没问题,但你需要分配find()的返回值,因为它返回一个新模型,而不仅仅是附加属性到现有模型。 - Devon
你可以通过使用Product::query()->find(...)来让你的IDE更加愉快。 - Charles Wood

2
请检查您的模型类是否已添加了软删除选项,如果是,则您的记录将不会从数据库中删除。

1
您的代码很好 - 文档 明确展示了您正在做的事情。
如果没有错误,并且颜色未被删除,那么 $color_id 没有按预期传递。尝试使用 findOrFail 或添加其他检查以确保找到了预期的模型。

1

我的问题是,路由文件中uri内的属性名称不正确:

Route::delete('/foo/{fo3o}', [DollyController::class, 'delete']);
                  -----^

我不知道为什么控制器方法能够正常工作:

public function delete(Foo $foo)
{
    $foo->delete();
    return ['message' => 'success'];
}

修改后问题得到解决,删除方法重新开始正常工作:

Route::delete('/foo/{foo}', [DollyController::class, 'delete']);
                ------^

1
 DB::table('pykcodes')
                ->where('user_id', $user_id)
                ->delete();

这可以直接使用模型之外的方式工作。 只需确保您从顶部调用use DB;


对于任何遇到这个问题的人,请注意这将不会触发模型事件 - Charles Wood

-5

你需要在用户模型中添加SoftDeletes:

...

使用 Illuminate\Database\Eloquent\SoftDeletes;
class User extends Authenticatable { use SoftDeletes; protected $dates = ['deleted_at']; }

...


这只有在您添加了 deleted_at 列并希望进行软删除时才会发生。如果您实际上想要删除行,这将是一个不好的解决方案。 - Devon
只有在用户表中有 deleted_at 列时才适用。请参阅 https://laravel.com/docs/5.7/eloquent 以添加软删除功能。 - Julius Garcia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接