我正在研究L5.5,我需要删除用户而不是他/她的帖子。所以我基本上需要将他/她的帖子分配给另一个必须是不可移动的用户。
我需要什么:
这是我目前的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');
}
感谢。
答案 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');