[Dbix-class] Updating lookup ID based on corresponding string
Marco
marco.prado.bs at gmail.com
Thu Sep 17 22:08:59 GMT 2015
Excerpts from Tim King's message of 2015-09-17 18:20:15 -0300:
> Hi, all.
>
> I have lookup-table relationships of the following form:
>
> __PACKAGE__->belongs_to(
> size => 'Schema::Result::SizeLookup',
> { 'foreign.size_id' => 'self.size_id' },
> );
>
>
> Now, I know that I can create a new row like this (all made-up
> pseudocode, so please forgive any typos), and have DBIC look up the
> size_id from the SizeLookup table:
>
> $schema->resultset('TeeShirt')->create({
> serial_number => 'XYZ1234',
> size => { name => 'large' },
> });
>
>
> But I would really like to be able to do something *similar* to this:
>
> $schema->resultset('TeeShirt')->create({
> serial_number => 'XYZ1234',
> size_name => 'large',
> });
>
> $tee_shirt->update({
> size_name => 'small',
> });
>
>
> We're a little surprised that this isn't a common desire, to be able to
> create/update looked-up IDs based on the corresponding identifying
> string. But we can't seem to find any off-the-shelf component that will
> enable something like this.
>
> We did see DBIx::Class::LookupColumn, but that provides additional
> methods, not column-like functionality.
>
> Any suggestions?
>
> Tim
>
If you use Moose together with DBIx you can write something along these
lines:
around 'create' => sub {
my $orig = shift;
my $self = shift;
my (%args) = @_;
if ($args{size_name}) {
$args{size} = { name => $args{size_name} };
}
$self->$orig(%args);
}
That will provide a way to map your 'new way' to provide arguments to
the 'create' function. You may also consider write a general
trait for that, so you can use in other classes the same behavior for
any <related_class>_<related_column> key contained in %args.
For pure DBIx class (no Moose), you can see
http://search.cpan.org/~ribasushi/DBIx-Class-0.082820/lib/DBIx/Class/Manual/Component.pod#CREATING_COMPONENTS
Should be easy for this use case and a little more difficult for the
general one.
--
Marco Arthur @ (M)arco Creatives
More information about the DBIx-Class
mailing list