Hi,

Very new to Catalyst, I think it's great but I'm groping about a bit here! I started using FromBuilder as per the book, but as everyone points out the book is dated and FormBuilder doesn't seem to be used much now, so I'm having a go with FormFu. Following along with the AdvancedCrud tutorial I have a simple edit action in Staff.pm and everything works fine. Now, my staff table has a foreign key relationship to locationid in the Location table (I'll put both models at the bottom of this), I build a drop box with ids and locations but when I call $form->model->update($person); (where $person = $c->model('DB::Staff')->find($id);) I get

|Caught exception in WsdSis::Controller::Staff->edit "The primary key and the 
foreign key may not be the same column in class WsdSis::Schema::Result::Location at 
/srv/WsdSis/script/../lib/WsdSis/Controller/Staff.pm line 80"
|

Where line 80 is the call to update. It actually updates the Staff table correctly, but then throws this before continuing. I'm confused why it's telling me that the primary and foreign keys are on the same column when it's primary in one table and foreign in the other. I got this working with FormBuilder so I'm thinking I can't be too far off base?!!

Many thanks in advanced!

Steve


package WsdSis::Schema::Result::Location;

use strict;
use warnings;

use base 'DBIx::Class';

__PACKAGE__->load_components("InflateColumn::DateTime", "Core");
__PACKAGE__->table("location");
__PACKAGE__->add_columns(
 "locationid",
{ data_type => "INT", default_value => undef, is_nullable => 0, size => 4 },
 "name",
 {
   data_type => "VARCHAR",
   default_value => undef,
   is_nullable => 0,
   size => 128,
 },
 "code",
 {
   data_type => "VARCHAR",
   default_value => undef,
   is_nullable => 1,
   size => 32,
 },
);
__PACKAGE__->set_primary_key("locationid");
__PACKAGE__->has_many(
 "courses",
 "WsdSis::Schema::Result::Course",
 { "foreign.locationid" => "self.locationid" },
);
__PACKAGE__->has_many(
 "staffs",
 "WsdSis::Schema::Result::Staff",
 { "foreign.locationid" => "self.locationid" },
);
__PACKAGE__->has_many(
 "students",
 "WsdSis::Schema::Result::Student",
 { "foreign.locationid" => "self.locationid" },
);

# Created by DBIx::Class::Schema::Loader v0.04005 @ 2009-05-08 08:53:55
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:IaDVNVK3kG3NwXKnqV3baA

# You can replace this text with custom content, and it will be preserved on regeneration
1;

package WsdSis::Schema::Result::Staff;

use strict;
use warnings;

use base 'DBIx::Class';

__PACKAGE__->load_components("InflateColumn::DateTime", "Core");
__PACKAGE__->table("staff");
__PACKAGE__->add_columns(
 "staffid",
{ data_type => "INT", default_value => undef, is_nullable => 0, size => 11 },
 "name_first",
 {
   data_type => "VARCHAR",
   default_value => undef,
   is_nullable => 0,
   size => 64,
 },
 "name_last",
 {
   data_type => "VARCHAR",
   default_value => undef,
   is_nullable => 0,
   size => 64,
 },
 "name_middle",
 {
   data_type => "VARCHAR",
   default_value => undef,
   is_nullable => 1,
   size => 64,
 },
 "username",
 {
   data_type => "VARCHAR",
   default_value => undef,
   is_nullable => 0,
   size => 32,
 },
 "password",
 {
   data_type => "VARCHAR",
   default_value => undef,
   is_nullable => 0,
   size => 32,
 },
"locationid",
{ data_type => "INT", default_value => undef, is_nullable => 1, size => 4 },
 "room",
 {
   data_type => "VARCHAR",
   default_value => undef,
   is_nullable => 0,
   size => 32,
 },
 "grade",
{ data_type => "VARCHAR", default_value => undef, is_nullable => 1, size => 2 },
);
__PACKAGE__->set_primary_key("staffid");
__PACKAGE__->add_unique_constraint("username", ["username"]);
__PACKAGE__->has_many(
 "sections",
 "WsdSis::Schema::Result::Section",
 { "foreign.staffid" => "self.staffid" },
);
__PACKAGE__->belongs_to(
 "locationid",
 "WsdSis::Schema::Result::Location",
 { locationid => "locationid" },
);
__PACKAGE__->has_many(
 "staff_role_staffids",
 "WsdSis::Schema::Result::StaffRole",
 { "foreign.staffid" => "self.staffid" },
);
__PACKAGE__->has_many(
 "staff_role_staffids",
 "WsdSis::Schema::Result::StaffRole",
 { "foreign.staffid" => "self.staffid" },
);

# Created by DBIx::Class::Schema::Loader v0.04005 @ 2009-05-08 08:53:55
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nHqMzIfDb+60wdQoinx79Q

# many_to_many():
#   args:
#     1) Name of relationship, DBIC will create accessor with this name
#     2) Name of has_many() relationship this many_to_many() is shortcut for
# 3) Name of belongs_to() relationship in model class of has_many() above
#   You must already have the has_many() defined to use a many_to_many().
__PACKAGE__->many_to_many(roles => 'staff_role_staffids', 'roleid');



#
# Helper methods
#
sub name_full {
   my ($self) = @_;

   return $self->name_last . ', ' . $self->name_first;
}

1;

--
Steve Rippl
Technology Director
Woodland School District
360 225 9451 x326


_______________________________________________
List: [email protected]
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/

Reply via email to