如何在Laravel中删除没有帖子的用户?

时间:2017-09-15 02:47:36

标签: php laravel laravel-5

我正在研究L5.5,我需要删除用户而不是他/她的帖子。所以我基本上需要将他/她的帖子分配给另一个必须是不可移动的用户。

我需要什么:

  1. 创建一个用户,即使是网站所有者也至少不能从前端删除,但可以进行编辑。 (大多数情况下就像这个应用程序的机器人)
  2. 如果我删除了一个用户,并且该用户有帖子,则这些帖子会保留并分配给该用户(bot)。这意味着这个机器人将成为这些帖子的作者。
  3. 检查编号2,只有当用户没有帖子时才发布帖子的用户才会删除他/她。
  4. 这是我目前的usecontroller销毁方法:

    public function destroy($id)
        {
            $user = User::findOrFail($id);
            Storage::delete($user->image);
            $user->delete();
            return redirect()->route('users.index')->with('flash_message', 'User successfully deleted');
        }
    

    感谢。

2 个答案:

答案 0 :(得分:1)

根据您的需要,您需要softDeletes模型中的User及其在数据库中的相应表格,现在这解决了第一个问题,即您不从表中删除用户只需添加deleted_at列

修改:当您使用Zizaco\Entrust\Traits\EntrustUserTrait时,您需要让您的用户模型看起来像这样:

class User extends Model implements AuthenticatableInterface
{
    use Authenticatable;
    use EntrustUserTrait { restore as private restoreA; }
    use SoftDeletes { restore as private restoreB; }

    public function restore()
    {
        $this->restoreA();
        $this->restoreB();
    }
}

有关此错误的详细信息,您需要查看:https://github.com/Zizaco/entrust/issues/742

所以现在进入第二点,检索已删除模型的帖子可以使用withTrashed()之类的内容:

$user = User::withTrashed()->all();
$user = User::withTrashed()->where('id', 1);

$posts = $user->posts()->get();
// Or do your relational things

即使您想将其分配给不同的用户,您也需要创建一个新用户并将更新方法应用于所有关系模型,同时删除用户,这似乎是一个坏主意。

修改

所以在这种情况下你可以:

$oldUser = User::find($id);
$user = User::find($botID); // Find the bot user

$oldFoods = $oldUser->food()->get();
foreach($oldFoods as $food)
{
    $food->user_id = $user->id;
    $food->save();
}

现在,如果用户没有帖子,那么你的第3点就可以做一些小的检查:

$user = User::find($request->id);
$posts = $user->posts()->get()->first();
if(isset($posts))
{
    $user->delete();
}
else
{
    $user->forceDelete();
}

希望这能证明您的所有需求。

结论最后,您可以将destroy方法放在userController中:

public function destroy($id)
{
    $user = User::findOrFail($id);
    $foods = $user->food()->get();
    if(isset($foods))
    {
       $botUser = User::where('username', '=', 'bot'); // Find the bot user
        foreach($foods as $food)
        {
            $food->user_id = $botUser->id;
            $food->save();
        }
        $user->delete();
    }
    else
    {
        $user->forceDelete();
    }
    Storage::delete($user->image);
    return redirect()->route('users.index')->with('flash_message', 'User successfully deleted');
}

答案 1 :(得分:0)

使用

编辑数据库
$table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users')
                    ->onDelete('restrict')
                    ->onUpdate('restrict');