X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRow.pm;h=0d086386df4238f82888a551313bb036d5f76be4;hb=e912f5f094315b0b5370ad3c9be58817cdf55256;hp=5bbabba2ca0cf818f48941191eadbc2211ed4e9b;hpb=728e60a34cad109fa1c69954b8f7c4c8fa0d15e1;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index 5bbabba..0d08638 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -21,13 +21,42 @@ DBIx::Class::Row - Basic row methods This class is responsible for defining and doing basic operations on rows derived from L objects. +Row objects are returned from Ls using the +L, L, +L and L methods, +as well as invocations of 'single' ( +L, +L or +L) +relationship accessors of L objects. + =head1 METHODS =head2 new - my $obj = My::Class->new($attrs); + my $row = My::Class->new(\%attrs); + + my $row = $schema->resultset('MySource')->new(\%colsandvalues); + +=over + +=item Arguments: \%attrs or \%colsandvalues + +=item Returns: A Row object -Creates a new row object from column => value mappings passed as a hash ref +=back + +While you can create a new row object by calling C directly on +this class, you are better off calling it on a +L object. + +When calling it directly, you will not get a complete, usable row +object until you pass or set the C attribute, to a +L instance that is attached to a +L with a valid connection. + +C<$attrs> is a hashref of column name, value data. It can also contain +some other attributes such as the C. Passing an object, or an arrayref of objects as a value will call L for you. When @@ -58,7 +87,7 @@ sub __new_related_find_or_new_helper { return $self->result_source ->related_source($relname) ->resultset - ->find_or_new($data); + ->find_or_create($data); } return $self->find_or_new_related($relname, $data); } @@ -166,13 +195,21 @@ sub new { =head2 insert - $obj->insert; + $row->insert; + +=over -Inserts an object into the database if it isn't already in -there. Returns the object itself. Requires the object's result source to -be set, or the class to have a result_source_instance method. To insert -an entirely new object into the database, use C (see -L). +=item Arguments: none + +=item Returns: The Row object + +=back + +Inserts an object previously created by L into the database if +it isn't already in there. Returns the object itself. Requires the +object's result source to be set, or the class to have a +result_source_instance method. To insert an entirely new row into +the database, use C (see L). To fetch an uninserted row object, call L on a resultset. @@ -265,7 +302,7 @@ sub insert { my $reverse = $source->reverse_relationship_info($relname); foreach my $obj (@cands) { $obj->set_from_related($_, $self) for keys %$reverse; - my $them = { $obj->get_columns }; + my $them = { %{$obj->{_relationship_data} || {} }, $obj->get_inflated_columns }; if ($self->__their_pk_needs_us($relname, $them)) { $obj = $self->find_or_create_related($relname, $them); } else { @@ -284,8 +321,16 @@ sub insert { =head2 in_storage - $obj->in_storage; # Get value - $obj->in_storage(1); # Set value + $row->in_storage; # Get value + $row->in_storage(1); # Set value + +=over + +=item Arguments: none or 1|0 + +=item Returns: 1|0 + +=back Indicates whether the object exists as a row in the database or not. This is set to true when L, @@ -305,24 +350,35 @@ sub in_storage { =head2 update - $obj->update \%columns?; + $row->update(\%columns?) + +=over + +=item Arguments: none or a hashref -Must be run on an object that is already in the database; issues an SQL -UPDATE query to commit any changes to the object to the database if -required. +=item Returns: The Row object -Also takes an options hashref of C<< column_name => value> pairs >> to update -first. But be aware that the hashref will be passed to -C, which might edit it in place, so dont rely on it being -the same after a call to C. If you need to preserve the hashref, it is -sufficient to pass a shallow copy to C, e.g. ( { %{ $href } } ) +=back + +Throws an exception if the row object is not yet in the database, +according to L. + +This method issues an SQL UPDATE query to commit any changes to the +object to the database if required. + +Also takes an optional hashref of C<< column_name => value> >> pairs +to update on the object first. Be aware that the hashref will be +passed to C, which might edit it in place, so +don't rely on it being the same after a call to C. If you +need to preserve the hashref, it is sufficient to pass a shallow copy +to C, e.g. ( { %{ $href } } ) If the values passed or any of the column values set on the object contain scalar references, eg: - $obj->last_modified(\'NOW()'); + $row->last_modified(\'NOW()'); # OR - $obj->update({ last_modified => \'NOW()' }); + $row->update({ last_modified => \'NOW()' }); The update will pass the values verbatim into SQL. (See L docs). The values in your Row object will NOT change @@ -330,7 +386,15 @@ as a result of the update call, if you want the object to be updated with the actual values from the database, call L after the update. - $obj->update()->discard_changes(); + $row->update()->discard_changes(); + +To determine before calling this method, which column values have +changed and will be updated, call L. + +To check if any columns will be updated, call L. + +To force a column to be updated, call L before +this method. =cut @@ -361,16 +425,32 @@ sub update { =head2 delete - $obj->delete + $row->delete + +=over + +=item Arguments: none + +=item Returns: The Row object -Deletes the object from the database. The object is still perfectly -usable, but C<< ->in_storage() >> will now return 0 and the object must -reinserted using C<< ->insert() >> before C<< ->update() >> can be used -on it. If you delete an object in a class with a C -relationship, all the related objects will be deleted as well. To turn -this behavior off, pass C<< cascade_delete => 0 >> in the C<$attr> -hashref. Any database-level cascade or restrict will take precedence -over a DBIx-Class-based cascading delete. See also L. +=back + +Throws an exception if the object is not in the database according to +L. Runs an SQL DELETE statement using the primary key +values to locate the row. + +The object is still perfectly usable, but L will +now return 0 and the object must be reinserted using L +before it can be used to L the row again. + +If you delete an object in a class with a C relationship, an +attempt is made to delete all the related objects as well. To turn +this behaviour off, pass C<< cascade_delete => 0 >> in the C<$attr> +hashref of the relationship, see L. Any +database-level cascade or restrict will take precedence over a +DBIx-Class-based cascading delete. + +See also L. =cut @@ -400,7 +480,18 @@ sub delete { =head2 get_column - my $val = $obj->get_column($col); + my $val = $row->get_column($col); + +=over + +=item Arguments: $columnname + +=item Returns: The value of the column + +=back + +Throws an exception if the column name given doesn't exist according +to L. Returns a raw column value from the row object, if it has already been fetched from the database or set by an accessor. @@ -408,6 +499,13 @@ been fetched from the database or set by an accessor. If an L has been set, it will be deflated and returned. +Note that if you used the C or the C