Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: DBIx::Class Build a Where Clause with multiple ORs and ANDs

by poj (Monsignor)
on Jan 03, 2018 at 08:32 UTC ( #1206584=note: print w/replies, xml ) Need Help??


in reply to DBIx::Class Build a Where Clause with multiple ORs and ANDs

I was successful able to produce this Where Clause:
( sent_email is NULL OR sent_email='0000-00-00');
using this snippet of code:
sent_email => {'!=', undef }, sent_email => {'!=', '0000-00-00

Are you sure, the code logic is NOT equal ? Try

my @proc_requests = $schema->resultset( 'TblRequests' )->search({ -or =>[ status => 'Review' , -and => [ -or => [ status => 'Offered', status => 'Denied', status => 'Cancelled', status => 'Conditional Offer', ], -or => [ sent_email => {'=', undef }, sent_email => {'=', '0000-00-00'}, ] ], ], }, { join => 'p' } );
poj

Replies are listed 'Best First'.
Re^2: DBIx::Class Build a Where Clause with multiple ORs and ANDs
by phildeman (Beadle) on Jan 03, 2018 at 15:34 UTC

    Hi poj,

    Thanks for your response. The send_email => {'!=' , ....} was deliberate.
    I do not want send_email to be undefined or have a value of '0000-00-00', when
    status is equal to Offered, Denied, Cancelled, or Conditional Offer.

    However, if the status equals Review, the sent_email can have any value.

    -Phil-

      This logic is always TRUE

      -or => [ sent_email => {'!=', undef }, sent_email => {'!=', '0000-00-00'} ],

      for it to be FALSE the sent_email must be both undefined AND '0000-00-00' which is not possible. I think you want

      -or =>[ status => 'Review' , -and => [ -or => [ status => 'Offered', status => 'Denied', status => 'Cancelled', status => 'Conditional Offer', ], sent_email => {'!=', undef }, sent_email => {'!=', '0000-00-00'}, ], ],
      poj

      I do not want send_email to be undefined or have a value of '0000-00-00', when status is equal to Offered, Denied, Cancelled, or Conditional Offer.

      However, if the status equals Review, the sent_email can have any value.

      But in your initial example in your OP you said:

      The where clause should be:
      WHERE status='Review' OR ( ( status='Offered' OR status='Denied' OR status='Cancelled' OR status='Conditional Offer') AND ( sent_email is NULL OR sent_email='0000-00-00') )

      I showed you how to achieve the outcome described in your most recent comment in an earlier thread. I've updated my response to your initial query today now that you've clarified your spec.


      The way forward always starts with a minimal test.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1206584]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (5)
As of 2018-02-22 11:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    When it is dark outside I am happiest to see ...














    Results (291 votes). Check out past polls.

    Notices?