[Dbix-class] search_literal
brett gardner
brett at clientcomm.com.au
Mon Sep 24 00:04:51 GMT 2007
Well
Is there anyway to do the following.
I have a Respondent record, which has a one to many relationship with
Answer records.
I want to be able to get a set of Respondents who answered a particular
way and I first tried do it like
my $rs = $schema->resultset('Respondent')->search(
{
'answers.question_id'=>$foo,
'answers.answer'=>$bar
},
{
join=>'answers',
}
);
Which works, but when you call search on this resultset again, ie,
searching withing that subset, it fails eg
$rs = $rs->search(
{
'answers.question_id'=>$foo_1,
'answers.answer'=>$bar_1,
},{
join=>'answers',
}
);
The resulting SQL does not join "answers" twice and puts in the where
clause
answers.question_id=$foo AND answers.question_id = $foo_1 AND answers.answer = $bar AND answers.answer = $bar_1
Which is incorrect.
I can only do with with an EXISTS subquery clause and this is not
available yet in SQL::Abstract (as far as I know) and I have to embed
the values directly into the SQL using search_literal as I cannot use
placeholders.
So is there anyway around this conundrum?
Matt S Trout wrote:
> On Fri, Sep 21, 2007 at 09:20:16AM +1000, brett gardner wrote:
>
>> Matt S Trout wrote:
>>
>>> On Thu, Sep 20, 2007 at 08:43:20AM +0100, Ash Berlin wrote:
>>>
>>>
>>>> brett gardner wrote:
>>>>
>>>>
>>>>> I think I have found a bug with search_literal. If you get a resultset
>>>>> that came from a search_literal, and try to apply another search_literal
>>>>> to it, the bind values are in the wrong order eg.
>>>>>
>>>>> my $rs = $schema->resultset('Foo')->search_literal('foo = ?', 1);
>>>>> $rs = $rs->search_literal('bar = ?',2);
>>>>>
>>>>> Spits out the sql
>>>>>
>>>>> SELECT foo.field
>>>>>
>>>> >FROM foo
>>>>
>>>>> WHERE ( ( foo.bar = ? AND foo.foo = ? ) )
>>>>>
>>>>> With a bind values array of "[1,2]". It should be a bind values array of
>>>>> "[2,1]".
>>>>>
>>>>> It seems to be adding the second literal string to the front of the
>>>>> where clause, but adding the values to the end of the array.
>>>>>
>>>>> I'm using 0.08003 but a quick search in the change log doesn't mention
>>>>> anything about search_literal
>>>>>
>>>>> Cheers,
>>>>> Brett Gardner
>>>>>
>>>>>
>>>>>
>>>> Sounds like a bug to me - can you please whip up a patch that gives us a
>>>> failing test case?
>>>>
>>>>
>>> Plus a doc patch saying "this only exists for Class::DBI compatibility, do
>>> -not- use in normal DBIx::Class code".
>>>
>>>
>>>
>> Do you mean do not use "search_literal" at all in DBIx::Class code?
>>
>
> Correct.
>
> There's never any reason to and it doesn't chain properly (as you've just
> noticed ...)
>
>
More information about the DBIx-Class
mailing list