DBIx::Class::DeleteAction - Define delete triggers
# Actor DBIC class package Your::Schema::Actor; use strict; use warnings; use base 'DBIx::Class'; __PACKAGE__->load_components("DeleteAction","PK","Core"); __PACKAGE__->table("actor"); __PACKAGE__->add_columns(qw/name/); __PACKAGE__->has_many( 'actorroles' => 'MyDB::Schema::ActorRole', { 'foreign.actor' => 'self.id' }, { delete_action => 'delete' } ); # Actor Role DBIC class package Your::Schema::ActorRole; use strict; use warnings; use base 'DBIx::Class'; __PACKAGE__->load_components("DeleteAction","PK","Core"); __PACKAGE__->table("actor_role"); __PACKAGE__->add_columns(qw/name actor production/); __PACKAGE__->belongs_to( 'actor' => 'MyDB::Schema::Actor', { 'foreign.id' => 'self.actor' }, { delete_action => sub { # Do something special } } ); __PACKAGE__->belongs_to( 'production' => 'MyDB::Schema::Production', { 'foreign.id' => 'self.production' }, { delete_action => 'deny' } ); # Somewhere else $schema->txn_do(sub { $actor->delete(); }); # Deletes all related actorroles only if they don't have a production # Finally deletes the actor itself $schema->txn_do(sub { $actor_role->delete(); }); # Calls custom subroutine on actor # Denies deletion if a production is related
With this DBIx::Class component you can specify actions that should be triggered on a row delete. A delete action is specified by adding the 'delete_action' key to the optional attribute HASH reference when specifing a new relation (see DBIx::Class::Relationship).
The following hash values are supported:
null
Set all columns in related rows pointing to this record to NULL. Only works on 'has_many' relationships.
delete OR cascade
Delete all related records one by one. This can trigger further delete actions.
deleteall
Delete all related records in a single step. This does not trigger further delete actions.
Only works on 'has_many' relationships.
deny
Deny deletion if this record is being referenced from other rows.
CODE reference
Executes the code referece on delete. The current DBIx::Class::Row object and the name of the relation are passed to the code reference.
DBIx::Class::Row
STRING
Execute a method with the given name. The method will be called on the current DBIx::Class::Row object and will be passed the name of the relation.
ignore
Do nothing
If you set the delete_action to execute a method or a code reference the method will be called with the following parameters:
delete_action
$self
The DBIx::Class::Row object the delete action has been called upon.
Relationship name
The name of the relationship that is currently being processed.
Related object(s)
The related object(s) for the given object and relationship.
Depending on the type of the relationship this can either be a DBIx::Class::Row or a DBIx::Class::ResultSet object.
Seen object(s)
An arraryref with object identifiers which have already been processed. If you want to call another delete method from your code you MUST pass on this variable so that we can ensure that each object/row is handled only once.
The helper method _delete_action_identifier returns the identification string fot the given object.
_delete_action_identifier
Extra values
An array of optional extra values that have been passed to delete
$object->delete(); OR $object->delete($seen_arrayref); OR $object->delete($seen_arrayref,@extra_values);
This method overdrives the DBIx::Class::Row delete method.
Make sure that you ALWAYS call delete always from within a TRANSACTION block.
delete
Note that the delete method in DBIx::Class::ResultSet will not run DeleteAction triggers. See delete_all if you need triggers to run.
DBIx::Class::ResultSet
delete_all
Any database-level cascade, restrict or trigger will be performed AFTER a DBIx-Class-DeleteAction based trigger.
Always use transactions, or else you might end up with inconsistent data.
Please report any bugs or feature requests to bug-dbix-class-deleteaction@rt.cpan.org, or through the web interface at http://rt.cpan.org/Public/Bug/Report.html?Queue=DBIx::Class::DeleteAction. I will be notified, and then you'll automatically be notified of progress on your report as I make changes.
bug-dbix-class-deleteaction@rt.cpan.org
Maroš Kollár CPAN ID: MAROS maros [at] k-1.com L<http://www.revdev.at>
This module was written for Revdev http://www.revdev.at, a nice litte software company I run with Koki and Domm (http://search.cpan.org/~domm/).
DBIx::Class::DeleteAction is Copyright (c) 2008 Maroš Kollár - http://www.revdev.at
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
The full text of the license can be found in the LICENSE file included with this module.
To install DBIx::Class::DeleteAction, copy and paste the appropriate command in to your terminal.
cpanm
cpanm DBIx::Class::DeleteAction
CPAN shell
perl -MCPAN -e shell install DBIx::Class::DeleteAction
For more information on module installation, please visit the detailed CPAN module installation guide.