自动删除Laravel中的相关行(Eloquent ORM)

当我使用这个语法删除一行时:

$user->delete(); 

有没有办法来附加一个callback的种类,所以它会例如自动执行此操作:

 $this->photo()->delete(); 

最好在模型类里面。

我相信这对于雄辩事件来说是一个完美的用例( http://laravel.com/docs/eloquent#model-events )。 您可以使用“删除”事件进行清理:

 class User extends Eloquent { public function photos() { return $this->has_many('Photo'); } // this is a recommended way to declare event handlers protected static function boot() { parent::boot(); static::deleting(function($user) { // before delete() method call this $user->photos()->delete(); // do the rest of the cleanup... }); } } 

你也许应该把整个事情放在一个交易中,以确保参照完整性。

你实际上可以在你的迁移中设置:

$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

来源: http : //laravel.com/docs/5.1/migrations#foreign-key-constraints

您还可以为约束的“on delete”和“on update”属性指定所需的操作:

 $table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade'); 

注意 :这个答案是为Laravel 3写的。 因此,在更新版本的Laravel中可能会也可能不会运行良好。

在实际删除用户之前,您可以删除所有相关的照片。

 <?php class User extends Eloquent { public function photos() { return $this->has_many('Photo'); } public function delete() { // delete all related photos $this->photos()->delete(); // as suggested by Dirk in comment, // it's an uglier alternative, but faster // Photo::where("user_id", $this->id)->delete() // delete the user return parent::delete(); } } 

希望它有帮助。

用户模型中的关系:

 public function photos() { return $this->hasMany('Photo'); } 

删除logging和相关:

 $user = User::find($id); // delete related $user->photos()->delete(); $user->delete(); 

从Laravel 5.2开始, 文档指出这些types的事件处理程序应该在AppServiceProvider中注册:

 <?php class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { User::deleting(function ($user) { $user->photos()->delete(); }); } 

我甚至想把它们移到单独的类中,而不是为了更好的应用程序结构而closures。

或者你可以这样做,如果你想,只是另一种select:

 try { DB::connection()->pdo->beginTransaction(); $photos = Photo::where('user_id', '=', $user_id)->delete(); // Delete all photos for user $user = Geofence::where('id', '=', $user_id)->delete(); // Delete users DB::connection()->pdo->commit(); }catch(\Laravel\Database\Exception $e) { DB::connection()->pdo->rollBack(); Log::exception($e); } 

注意,如果你不使用默认的laravel db连接,那么你需要执行以下操作:

 DB::connection('connection_name')->pdo->beginTransaction(); DB::connection('connection_name')->pdo->commit(); DB::connection('connection_name')->pdo->rollBack(); 

在我的情况下,这是非常简单的,因为我的数据库表是InnoDB的外键和Cascade on Delete。

因此,在这种情况下,如果您的照片表中包含用户的外键引用,那么您所要做的就是删除酒店,清理过程将由数据库完成,数据库将从数据中删除所有照片logging基础。