in reply to Re: Re: Class::DBI has_a relationships
in thread Class::DBI has_a relationships

That (what you have) declares that a User has many Sessions::Metadata and that a Session has many Sessions::Metadata, but you also have to tell Sessions::Metadata that it references Users and Sessions as well.

My snippet in question is specifying that a User can have many Sessions::Metadata classes, and the Users' foreign key 'session_id' references the Sessions::Metadata primary key 'id'. Now, whether or not this is the right fit for your database table relationship is the question, and since i don't know what it looks like, i can only speculate.

jeffa

L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
(the triplet paradiddle with high-hat)

Replies are listed 'Best First'.
Re: 3Re: Class::DBI has_a relationships
by CassJ (Sexton) on May 18, 2004 at 17:30 UTC
    OK. descriptions of tables are below.

    Both Users and Sessions are referenced by Sessions_Metadata

    Class::DBI doc says has_many is used to declare that another table is referencing us, so both Users and Sessions need a has_many(sessions_metadata)?

    I tried this in sessions:

    __PACKAGE__->has_many( sessions_metadata=>['EP::Common::DBI::Sessions_M +etadata' => 'session_id' ] => 'id' );
    (and equiv in users) which I was hoping meant that 'session_id' is an FK in Sessions_Metadata which refers to 'id': the PK in sessions.
    Still get the same error.
    have I got the wrong end of the stick?
    sessions_metadata Column | Type | Modifiers -------------+------------------------+----------- session_id | character(32) | not null username | character varying(40) | create_date | character varying(100) | expire | character varying(100) | query_id | character varying(50) | Indexes: sessions_metadata_pkey primary key btree (session_id) Foreign Key constraints: $1 FOREIGN KEY (session_id) REFERENCES sessio +ns(id) ON UPDATE NO ACTION ON DELETE NO ACTION, $2 FOREIGN KEY (username) REFERENCES users(us +ername) ON UPDATE NO ACTION ON DELETE NO ACTION sessions Column | Type | Modifiers -----------+---------------+----------- id | character(32) | not null a_session | text | Indexes: sessions_pkey primary key btree (id) users Column | Type | Modifiers --------------+------------------------+-------------------- username | character varying(40) | not null password | character varying(40) | not null salt | smallint | not null session_only | smallint | not null default 0 first_name | character varying(40) | not null last_name | character varying(40) | not null institute | character varying(255) | department | character varying(255) | address | character varying(255) | telephone | character varying(255) | email | character varying(100) | not null Indexes: users_pkey primary key btree (username)

      Seems to me that your relationships are a bit off. At first i thought that Sessions_Metadata was a cross reference between Users and Sessions. But it is not. Instead, it is extra info for a session. Now, if this were my project, i would only have two tables: Users and Sessions. It seems to me that everything in Sessions_Meta data relates to a session, therefore, why not just put those attributes in the Sessions table?

      sessions
         Column    |          Type          | Modifiers 
      -------------+------------------------+-----------
       id          | character(32)          | not null
       a_session   | text                   | 
       username    | character varying(40)  | 
       create_date | character varying(100) | 
       expire      | character varying(100) | 
       query_id    | character varying(50)  | 
      
      It will greatly simply your task. Also ... why are you using a character type for the primary key? You should be using an "auto-incremented" integer, preferably unsigned. Likewise, you should also be using the same for your primary key in the Users table.

      UPDATE:
      I think that is correct, CassJ.

      jeffa

      L-LL-L--L-LL-L--L-LL-L--
      -R--R-RR-R--R-RR-R--R-RR
      B--B--B--B--B--B--B--B--
      H---H---H---H---H---H---
      (the triplet paradiddle with high-hat)
      
        It's not my DB. I don't know anything much about DB design, so I was just using what I was given. I don't see any reason why we sessions and sessions_metadata couldn't be merged though.
        I'll give it a go with my local version (might take a while!).

        If I do that then I'll have just a sessions table with a FK to users - right?

        So Sessions.pm

        has_a(username=>'Users')
        and Users
        has_many(sessions=>[Sessions=>'username']=>'username)
        Does that sound right?

        Cxx