Hi Alex, there is no such thing as inheritance in an RDBMS, so why whould an ORM extend one table class (called resultsource/resultset in DBIC) to form another table class? To get you started it's usually the easiest to let dbicdump [1] create all the DBIC classes and look at what it generated. Also the glossary [2] is a great thing to read before the rest of the docs to know which terms the docs use for the various components.
[1] https://metacpan.org/module/dbicdump [2] https://metacpan.org/module/DBIx::Class::Manual::Glossary BR Alex Am 2012-06-15 10:30, schrieb Alex Erzin: > I'm confused with "package Host; extends 'Base';" > I expect "extends 'Target'", not 'Base'. Is it correct? > > 15.06.2012, 12:06, "Hailin Hu" <[email protected]>: >> I have no idea about "standard" solution, but another idea for reference :) >> >> Package Base; >> use base 'DBIx::Class::Core'; >> >> # parents' name should be a defined has_one or belong_to relationship >> has 'parents' => ( >> is => 'rw', >> isa => 'ArrayRef[Str]', >> builder => _build_parents, >> ); >> >> sub inflate_result { >> my $self = shift; >> my $ret = $self->next::method( @_ ); >> foreach my $relationship ( @{ $ret->parents } ) { >> my $parent = $ret->$relationship; >> my @columns = ... # @columns_in_$parent - @column_in_$ret >> foreach my $column ( @columns ) { >> # stolen from DBIx::Class's source >> no strict 'refs'; >> no warnings 'redefine'; >> my $method = join '::', ref $ret, $column; >> *$method = Sub::Name::subname( $method, sub { >> return $ret->$parent->$column; >> }); >> } >> } >> } >> ... >> >> package Target; >> extends 'Base'; >> ... >> >> package Host; >> extends 'Base'; >> __PACKAGE__->belong_to('target' => 'Target', 'target_id'); >> sub _build_parents {[qw/target/]} >> ... >> >> so just declare the attribute 'parents' in subclass is ok. >> the task is not typical for me, but interesting. >> >> On Fri, Jun 15, 2012 at 3:59 PM, Alex Erzin <[email protected]> wrote: >> >>> Yes, in some cases you are right, but you are saying about "long >>> inheritance chains" and other cases where inheritance is not enought >>> flexible, >>> but i say about just one case in one place where inheritance is preferred >>> for me, and i try to find solution _how_ to implement inheritance, but not >>> about _why_not_ :) >>> >>> 15.06.2012, 10:43, "Ben Tilly" <[email protected]>: >>>> The benefits of OOP are mostly in information hiding. >>>> >>>> If you're creating a bunch of long inheritance chains, you're probably >>>> doing OOP poorly. Composition is preferred. And maps *much* more >>>> naturally onto a relational database. >>>> >>>> On Thu, Jun 14, 2012 at 11:37 PM, Alex Erzin <[email protected]> wrote: >>>>> Hm... it really works, but where are benefits of OOP? ;) >>>>> There is no inheritance at all, and to access parent's properties I >>>>> should call parent directly, so inheritance just replaced with >>>>> incapsulation, and it's no one what i try to find. >>>>> >>>>> Some years ago we have implemented inheritance in ORM in some >>>>> commercial project in Perl, later I have swithed to java and have found >>>>> Hibernate it really cool with ORM. >>>>> But now I have returned to Perl and I think that DBIx::Class can help >>>>> me with ORM, but right now i'm confused that cannot find "standard" >>>>> solution for typical task. >>>>> >>>>> 15.06.2012, 10:25, "Hailin Hu" <[email protected]>: >>>>>> Is it acceptable like something below >>>>>> >>>>>> package Target; >>>>>> ... >>>>>> package Host; >>>>>> ... >>>>>> __PACKAGE__->belong_to('target' => 'Target', 'target_id'); >>>>>> sub column_only_exists_in_target { >>>>>> my $self = shift; >>>>>> return $self->target->column_only_exists_in_target; >>>>>> } >>>>>> >>>>>> well, it is not a good solution, but it could work, I think :) >>>>>> >>>>>> On Fri, Jun 15, 2012 at 3:04 PM, Alex Erzin <[email protected]> wrote: >>>>>>> Hello, >>>>>>> >>>>>>> I need to implement table-per-class inheritance, as it simple made >>>>>>> in Hibernate in Java (more details can be found here >>>>>>> http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch10.html#inheritance-tablepersubclass), >>>>>>> but cannot find right way how to do it in DBIx::Class. >>>>>>> >>>>>>> For example, I have two objects: Target (with properties ID, >>>>>>> Description) and Host (ID, Hostname, IP), Host inherited from Target, >>>>>>> and on table-level there are two tables Host and Target, joined by ID >>>>>>> field. >>>>>>> >>>>>>> CREATE TABLE `mydb`.`target` ( >>>>>>> `target_id` INT NOT NULL , >>>>>>> `description` VARCHAR(45) NULL , >>>>>>> PRIMARY KEY (`target_id`) ) >>>>>>> >>>>>>> CREATE TABLE `mydb`.`host` ( >>>>>>> `target_id` INT NOT NULL , >>>>>>> `hostname` VARCHAR(45) NULL , >>>>>>> `ip` VARCHAR(45) NULL , >>>>>>> PRIMARY KEY (`target_id`) , >>>>>>> CONSTRAINT `fk_host_target` >>>>>>> FOREIGN KEY (`target_id` ) >>>>>>> REFERENCES `mydb`.`target` (`target_id` ) >>>>>>> ) >>>>>>> >>>>>>> How to implemeng there classes Target and Host, so it possible to >>>>>>> write >>>>>>> >>>>>>> print $target->id(), $targer->description() >>>>>>> print $host->id(), $host->description(), $host->hostname(), >>>>>>> $host->ip() >>>>>>> >>>>>>> ? >>>>>>> >>>>>>> I have no ideas how to implement inheritance, and all my experiments >>>>>>> are failed - from Host i cannot get access to parent properties like >>>>>>> description. >>>>>>> Could you help me please (with examples)? >>>>>>> >>>>>>> Thanks. >>>>>>> >>>>>>> -- >>>>>>> eaa@ >>>>>>> >>>>>>> _______________________________________________ >>>>>>> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class >>>>>>> IRC: irc.perl.org#dbix-class >>>>>>> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/ >>>>>>> Searchable Archive: >>>>>>> http://www.grokbase.com/group/[email protected] >>>>>> _______________________________________________ >>>>>> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class >>>>>> IRC: irc.perl.org#dbix-class >>>>>> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/ >>>>>> Searchable Archive: >>>>>> http://www.grokbase.com/group/[email protected] >>>>> -- >>>>> eaa@ >>>>> >>>>> _______________________________________________ >>>>> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class >>>>> IRC: irc.perl.org#dbix-class >>>>> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/ >>>>> Searchable Archive: >>>>> http://www.grokbase.com/group/[email protected] >>>> _______________________________________________ >>>> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class >>>> IRC: irc.perl.org#dbix-class >>>> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/ >>>> Searchable Archive: >>>> http://www.grokbase.com/group/[email protected] >>> -- >>> eaa@ >>> >>> _______________________________________________ >>> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class >>> IRC: irc.perl.org#dbix-class >>> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/ >>> Searchable Archive: >>> http://www.grokbase.com/group/[email protected] >> _______________________________________________ >> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class >> IRC: irc.perl.org#dbix-class >> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/ >> Searchable Archive: >> http://www.grokbase.com/group/[email protected] *"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"* T-Systems Austria GesmbH Rennweg 97-99, 1030 Wien Handelsgericht Wien, FN 79340b *"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"* Notice: This e-mail contains information that is confidential and may be privileged. If you are not the intended recipient, please notify the sender and then delete this e-mail immediately. *"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"* _______________________________________________ List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class IRC: irc.perl.org#dbix-class SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/ Searchable Archive: http://www.grokbase.com/group/[email protected]
