[Dbix-class] Bug with relationships on new objects.

Brett Gardner brett at clientcomm.com.au
Mon Jan 7 20:36:56 GMT 2008


I'm not saying that the test is incorrect. That is when a foreign key is 
empty. The case that affects me is when the primary key is empty.

To use the examples below, it is like saying that a new Artist owns all 
the existing CDs even though those CDs have their Artists set, until 
insert is called.

Brett

Brett Gardner wrote:
> I call new because I then call a method on the object which returns a 
> list of form controls to edit the object.
>
> In other cases I also have to set accessors before calling the insert 
> method.
>
> Jess Robinson wrote:
>>
>>
>> On Mon, 7 Jan 2008, brett gardner wrote:
>>
>>> The offending line is on line 793 of ResultSource.pm
>>>
>>> $ret{$k} = $for->get_column($v) if $for->has_column_loaded($v);
>>
>> That's because has_column_loaded returns true if the data is in/was 
>> loaded from the database, you're calling new(), which doesnt insert a 
>> new row into the database. So it's doing the correct thing.
>>
>> Call create() instead. That does new() and insert().
>>
>>> my $undef_artist_cd = $schema->resultset("CD")->new_result({ 'title' 
>>> => 'badgers', 'year' => 2007 });
>>> 207 is($undef_artist_cd->has_column_loaded('artist'), '', 'FK not 
>>> loaded');
>>> 208 is($undef_artist_cd->search_related('artist')->count, 3, 'open 
>>> search on undef FK');
>>
>> new_result (or new) don't insert any data in the db, so this is 
>> perfectly correct.
>>
>>> in 66relationship.t
>>>
>>> brett gardner wrote:
>>>> I have a schema where there are clients who have subscribers.
>>>>
>>>> So there is an object "Client" which has a has_many relationship to 
>>>> "Subscriber".
>>>>
>>>> If I do the following
>>>>
>>>> my $client = $app->schema->resultset('Client')->find(...);
>>>> my $subscribers = $client->subscribers;
>>>>
>>>> Then the relationship is correct and only pulls out the subscribers 
>>>> attached to that client.
>>>>
>>>> But if I do the following.
>>>>
>>>> my $client = $app->schema->resultset('Client')->new({});
>>>> my $subscribers = $client->subscribers;
>>>> Then all the subscribers are pulled out which is not ideal and 
>>>> potentially a very embarrassing privacy breach. Looking at the SQL 
>>>> generated by "$client->subscribers" it is not putting in the 
>>>> limiting where clause "WHERE me.client_id = ..."
>>
>> As your row is not in the database, how would you expect it to do a 
>> where?
>>
>>
>> Did you really miss all this, or am I misunderstanding your problem?
>>
>> Jess
>>
>> _______________________________________________
>> 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/dbix-class@lists.rawmode.org
>>
>>
>
> _______________________________________________
> 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/dbix-class@lists.rawmode.org
>
>



More information about the DBIx-Class mailing list