当前位置: 首页 > 知识库问答 >
问题:

Laravel-集合::delete方法不存在

孟花蜂
2023-03-14

我正在尝试测试boot()static::deleting方法,该方法在通过Eloquent删除模型时应该触发。

tinkerApp\User::find(6)中的命令-

如果我尝试使用App\User::其中('id',6)-

这是整个用户模型

 <?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    public function profile() {
        return $this->hasOne(Profile::class);
    }

    public function posts() {
        return $this->hasMany(Post::class);
    }

    public function tempUploads() {
        return $this->hasMany(TempUploads::class);
    }
    
    protected static function boot() {
        parent::boot();
        
        static::created(function ($user) {
            $user->profile()->create(['id' => $user->username, 'avatar' => '/storage/avatars/edit-profile.png']);
            mkdir(public_path() . "/storage/images/" . $user->username , 0755);

            // $data = [
            //  'user_id' => $user->username
            // ];
            // Mail::to($user->email)->send(new WelcomeMail($data));
        });

        static::deleting(function ($user) {
            $user->posts->delete();
            if ($user->profile->avatar != '/storage/avatars/edit-profile.png') {
                if ($user->profile->cover != NULL && $user->profile->cover != '') {
                    $oldAvatar = $_SERVER['DOCUMENT_ROOT'] . $user->profile->avatar;
                    $oldCover = $_SERVER['DOCUMENT_ROOT'] . $user->profile->cover;
                    if (is_file($oldAvatar) && is_file($oldCover)) {
                        unlink($oldAvatar);
                        unlink($oldCover);
                    } else {
                        die("Грешка при изтриване на стария файл. File does not exist in profile deleting method.");
                    }
                }
            }
            $user->profile->delete();
        });
    }

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'username', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

我已经花了几个小时在谷歌上寻找可能的解决方案,但还没有找到。

如何在触发引导删除方法时正确删除用户模型?


共有3个答案

汝跃
2023-03-14

我认为它是这样工作的,更简单。

$user->posts()->each->delete();
冯嘉荣
2023-03-14

您可以通过仅使用一个查询来删除所有帖子来优化lagbox的答案。在他的例子中,他正在对附加到用户的每个帖子执行删除查询。

对于单个delete查询,请直接使用关系的查询生成器:

$user->posts()->delete();

或者使用集合的pulk方法和单独的查询:

Post::where('id', $user->posts->pluck('id'))->delete();
孟豪
2023-03-14

删除侦听器中,您试图删除其他内容,这是导致错误的集合。

$user-

// calling `delete()` on a Collection not a Model
// will throw the error you see
$user->posts->delete();

// iterate through the Collection
foreach ($user->posts as $post) {
    $post->delete();
}

附带说明:您不能对模型和查询批量执行任何操作,并且可以触发事件。所有Model事件都基于Model的单个实例。直接查询绕过Model。

 类似资料:
  • 我正在使用Laravel 5.8,在这个项目中,我想从数据库中的一个表中删除一些数据,所以我在Blade上对其进行了编码: 这是路线: 这是WalletController的控制器销毁方法: 但是一旦我运行这个,我就会收到这个错误消息: 方法照亮\数据库\雄辩\集合::de不存在。 那么这里出了什么问题?我如何解决这个问题?

  • 我用的是拉威尔5.8 我有一个封闭的问题: $user=user::get(); 然后这不起作用: $用户- 出现这种情况: 方法照亮\数据库\雄辩\集合::跳过不存在。 告诉我我应该做些什么来实现这一目标而不出错?

  • 嗨,我正在学习laravel。我使用雄辩的ORM删除方法,但我得到了不同的结果。不是真的或假的,而是空的。我设置了一个资源路由,在UsersController中有一个销毁方法。 但是我总是得到一个响应{“status”:“0”,“msg”:“failed”},数据库中的记录被删除。 然后我使用dd($res)。它在页面中显示null。 但是从课程中我学习到它返回一个布尔值true或false。

  • 我有一个非常奇怪的问题。当我提交表单时,它会引发服务器端验证错误。 BadMethodCallException 方法[validation必需]不存在。 我的控制器: 控制器在方法

  • 最直接的方法,通过id删除用户 @At public Object delete(@Param("id")int id, @Attr("me")int me) { if (me == id) { return new NutMap().setv("ok", false).setv("msg", "不能删除当前用户!!"); }

  • 全部显示 Delete 方法应用于 DocumentProperty 对象的情形。 删除自定义的文档属性。 expression.Delete expression 必需。该表达式返回上面对象之一。 说明 不能删除内置的文档属性。 Delete 方法应用于 AnswerWizardFiles 对象的情形。 从集合中删除指定对象。 expression.Delete(FileName) expres