[Dbix-class] search vs. find

Frank Speiser frank at takkle.com
Thu Jun 7 00:49:04 GMT 2007


Brandon Black wrote:
> On 6/6/07, John Goulah <jgoulah at gmail.com> wrote:
>> > > From DBIx::Class::Manual::Cookbook
>> > >
>> (http://search.cpan.org/~mstrout/DBIx-Class-0.07000/lib/DBIx/Class/Manual/Cookbook.pod#Retrieving_a_row_object 
>>
>> > > )
>> > >  my $schema = $cd->result_source->schema;
>> > >  my $artist_rs = $schema->resultset('Artist');

>> Actually this gets the schema, and the resultset object out of that.  
>> The
>> object that comes out of this is the same object that is returned from
>> search. The only reason I posted back is b/c I thought someone else may
>> benefit from the fact that you can get this out of there if you need 
>> to for
>> some reason, in my case, I'll just use search.
>>
>>
>
> But it doesn't do what you think it does.  Those two lines of code get
> you the resultset object for the entire "Artist" table, not for your
> one row.
>
Really? I wouldn't have thought that myself. That doesn't seem to do 
what I'd expect.

Is "find" then, what "retrieve" is to CDBI ?

It seems like there is a way to make everyone on this thread happy.
The documentation implies that you CAN specify your own where clauses 
for searches so you can narrow down your search if you want, and still 
use regular old SQL (using search_literal):

-- warning, I lifted this directly from the person I am posting back to 
;) --

http://search.cpan.org/~blblack/DBIx-Class-0.07006/lib/DBIx/Class/Manual/Intro.pod#Finding_your_objects

ie.,

  # Find Peter Frampton albums from the year 1986
  my $where = 'artist = ? AND year = ?';
  my @bind  = ( 'Peter Frampton', 1986 );
  my $rs    = $schema->resultset('Album')->search_literal( $where, @bind );

Because I think the underlying issue is THIS is really much more cumbersome than the corresponding SQL statement:

  my $rs = $schema->resultset('Album')->search({
    artist  => { '!=', 'Janis Joplin' },
    year    => { '<' => 1980 },
    albumid => { '-in' => [ 1, 14, 15, 65, 43 ] }
  });


So, if you used "search_literal" you could return the row as an object, no? 



-frank

-- 
Frank Speiser
CTO
TAKKLE, Inc.
frank at takkle.com




More information about the Dbix-class mailing list