<html><body><div style="color:#000; background-color:#fff; font-family:arial, helvetica, sans-serif;font-size:12pt"><div><span>Thanks. It works now. But I guess I can take Boombatowers conversions with a grain of salt.<br></span></div><div> </div><div><font color="#ff007f" face="bookman old style, new york, times, serif" size="4"><i><strong>Nancy</strong></i></font></div> <div><font face="arial, helvetica, sans-serif">Injustice anywhere is a threat to justice everywhere. -- Dr. Martin L. King, Jr.</font></div><div><br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt;"><div style="font-family: times new roman, new york, times, serif; font-size: 12pt;"><font face="Arial" size="2"><hr size="1"><b><span style="font-weight:bold;">From:</span></b> Jamie Holly<br></font><br>
<div id="yiv1281991303">
<div>
Doing a join doesn't return the query interface, but rather the
alias that was assigned to the joined table. Since variable
assignment is processed left to right once it processes the ::join
method your $users variable now contains the table alias.<br>
<br>
What you want to do is stop your chaining before any methods that
don't return the SelectQuery object you are building:<br>
<br>
$query = db_select('user_badges_user', 'ubu')<br>
->fields('u', array('uid', 'name'))<br>
->condition('ubu.bid', $badge->bid); // Up to here you
get a SelectQueryInterface returned and assigned to query<br>
$query->join('users', 'u', 'u.uid = ubu.uid'); // Calls the join
method on $query, but doesn't assign the return;<br>
$users = $query->execute(); // Returns the
DatabaseStatementInterface that you pull your results from<br>
<br>
Generally I try to add joins at the beginning of the construction.
It seems to make it easier to read (it seems most of Drupal's core
code does the same), so I would write this query like this:<br>
<br>
$query = db_select('user_badges_user', 'ubu');<br>
$query->join('users', 'u', 'u.uid = ubu.uid');<br>
$query->fields('u', array('uid', 'name'))<br>
->condition('ubu.bid', $badge->bid);<br>
$users = $query->execute();<br>
<br>
You could assign $users when you add the fields and conditions, but
this does make it easier if you want to add anything else to the
query down the road. <br>
<br>
Easiest thing to remember is that if you get a non-member/non-object
error, then the item right above that doesn't return the proper
class and you should stop variable assignment there and instead just
call the method without assignment (ie: $query->join('users',
'u', 'u.uid = ubu.uid')). <br>
<br>
Chaining might look a little better and save a few keystrokes, but
it really doesn't bring any performance enhancements and can keep
headaches to a minimum, especially when working on classes you
aren't that familiar with. <br></div></div></div></div></blockquote></div></div></body></html>