The same argument can be made that SQL is hard to use, when you don't
know SQL.
I'm sure at some point in your life you've spent "a few hours"
learning SQL.
Granted, if there are deadlines and you need to get things done, then
by all means use query() (that is why it's there, after all).

Sure, not every condition is going to be as easy as 'Model.field' =>
55,
but the ability to use find() and get all associated models and reap
full benefits of using the framework is worth some
learning curve, IMO.




On Dec 26, 8:26 am, erturne <eric.tur...@turner-wa.com> wrote:
> I think you're missing the point of my blog entry! :) I realize that
> find() is semantically the same as using the query approach (and gives
> you some cake magic). In an ideal world i wouldn't use query(). The
> point is that find() is difficult to use. How many posts in this group
> have you read about trying to make find() return the results someone
> needs? I spent a couple of hours trying (unsuccessfully even with help
> from the group) to work with find(), then fell back to query() in the
> face of a looming deadline because i was able to make that work very
> quickly. We need better documentation, a change in how find() works,
> or smarter developers.
>
> Oh, and you missed that the input date is validated before being used
> in the query. :) In production code i never use any externally-
> provided input without validating it first.
>
> Webweave wrote:
> > I think you're missing the point on the find() method. Doing a find
> > ('all', $conditions) would do exactly the same thing that you are
> > doing with your query approach, and allow you to take advantage of the
> > Cake magic.
>
> > In your blog, you create a findByDate function that builds a SQL
> > statement. First of all, I would point out that concatenating a string
> > into SQL always makes me shudder since it exposes you to SQL
> > injection.
>
> > But ignoring that for a moment, you can simply rewrite that function
> > as:
>
> >  function findByDate($date) {
>
> >    // TODO: validate $date
>
> >    $periodsExist  = '(EXISTS select '1' from menu_periods MenuPeriod
> > where MenuPeriod.period_start <= ? AND MenuPeriod.period_end > ? AND
> > MenuPeriod.menu_id=Menu.menu_id)';
> >    $postingsExist = '(EXISTS select '2' from menu_postings where
> > MenuPosting.post_start <= NOW() AND MenuPosting.post_end > NOW() and
> > MenuPosting.menu_id = Menu.menu_id)';
> >    $conditions = array('AND' => array( $periodsExist => array($date,
> > $date),
> >                                        $postingsExist)
> >                       );
>
> >    $menus = $this->Menu->find('all', array('conditions' =>
> > $conditions));
> >    return $menus;
> >   }
>
> > And somebody smarter than me could probably make this even simpler,
> > but this seems cleaner and safer to me than using query.
>
> > On Dec 22, 7:15 pm, erturne <eric.tur...@turner-wa.com> wrote:
> > > So there's the hard part... understanding how find() works! I think
> > > I'm pretty close to understanding it, but for what I was doing I
> > > simply ran out of time and could not justify struggling with find()
> > > anymore. I read so many articles on Google, read and re-read the
> > > sections of the cookbook, etc. Maybe I'm dense but I spent hours
> > > trying to get find() to return the data I wanted. Check out my blog
> > > post 
> > > athttp://erturne-cakephp.blogspot.com/2008/12/retrieving-model-data-fin...
> > > for a description of the problem and a few of the things I tried.
>
> > > On Dec 19, 6:56 pm, teknoid <vlad...@gmail.com> wrote:
>
> > > > query() is not a recommended practice...
> > > > besides a few points you've mentioned (and don't think that
> > > > portability is not important, you'd be surprised what happens when
> > > > oracle invests $1M into your company, but now you gotta switch
> > > > DB's ;)), i've outlined a few more here:
>
> > > >http://teknoid.wordpress.com/2008/05/09/cakephp-and-custom-sql/
>
> > > > besides, once you understand how find() works, it's becomes a lot
> > > > easier to manage/maintain than writing custom SQL
>
> > > > On Dec 19, 6:26 pm,erturne<eric.tur...@turner-wa.com> wrote:
>
> > > > > I have to ask... if you have to take extra measures to specify your
> > > > > join conditions, why not just provide a method in a model that uses
> > > > > query() with a simple-to-understand SQL statement? All these find()
> > > > > contortions, while interesting, may not be the easiest to maintain
> > > > > later on when you have to decipher what you were trying to do. I
> > > > > suppose you have to worry about SQL statement portability, but really
> > > > > how often do you have to move your database from one server type to
> > > > > another? And if you keep all your queries in your models at least it's
> > > > > easy to find what needs to change should you move to a different
> > > > > database.
>
> > > > > On Dec 19, 12:51 pm, Webweave <webwe...@gmail.com> wrote:
>
> > > > > > OK, it depends on what you are really trying to fetch. Are you 
> > > > > > trying
> > > > > > to restrict the Advert results to just those that have data in the
> > > > > > hasMany tables, or are you trying to restrict the child table 
> > > > > > values ?
>
> > > > > > If it's the former, I would just use a condition that includes a
> > > > > > select for that condition specifically. For instance, in my
> > > > > > VolunteerCake application, I have a structure where I have a Job 
> > > > > > that
> > > > > > has signup Slots associated with it. I want to list jobs with
> > > > > > available slots (meaning there are not more Slot rows than a max 
> > > > > > field
> > > > > > in the jobs table), so I use a condition like:
>
> > > > > > $whereArray = array(
> > > > > > 'AND' => array(
> > > > > > 'Slot.max_signups > (select count(1)
> > > > > > from user_slots s2 where s2.slot_id = Slot.slot_id)',
> > > > > > 'Slot.job_id = '.$id
> > > > > > )
> > > > > > );
>
> > > > > > Note that the "select count" is enclosed in parens, and compared to
> > > > > > the Slot.max_signups. This correlated sub-query causes the database 
> > > > > > to
> > > > > > do an implicit join, without Cake having to understand the
> > > > > > relationship.
>
> > > > > > If it's the latter, you can add your condition to the belongsTo or 
> > > > > > do
> > > > > > a separate find for the related data.
>
> > > > > > On Dec 19, 1:53 am, dev <minde...@gmail.com> wrote:
>
> > > > > > > i posted code here:http://bin.cakephp.org/saved/40741
>
> > > > > > > How to join Image and Option tables if i want to set these find
> > > > > > > conditions in Advert?
>
> > > > > > > I tried Containable (test2 function), but it selects all Adverts, 
> > > > > > > and
> > > > > > > if i set conditions in first paginate array - it generates the 
> > > > > > > same
> > > > > > > error, bicause tables don't join.
>
> > > > > > > How to solve this problem?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"CakePHP" group.
To post to this group, send email to cake-php@googlegroups.com
To unsubscribe from this group, send email to 
cake-php+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to