自动删除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基础。