I have this snippet from the Laravel documentation:
DB::table('users')
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('orders')
->whereRaw('orders.user_id = users.id');
})
->get();
I need to understand two things.
$query
parameter to the closure come from? I suspect that there is something happening under the hood that I don't understand. The function takes 1 parameter, the $query
, but where does it come from, how does this function know what is in this parameter, what is passed into the function?return
statement. So how does the whereExists
method know the return value of the closure?Refer to the source: https://github.com/laravel/framework/blob/987a21f39f203c76665f6014cbef10451689fbdd/src/Illuminate/Database/Query/Builder.php#L1333
As you can see the closure is treated like a callback.
So whereExists
passes $query
to it. $query
is an instance of self (Builder) class, so the code in the closure is just updating the object.
/**
* Add an exists clause to the query.
*
* @param \Closure $callback
* @param string $boolean
* @param bool $not
* @return $this
*/
public function whereExists(Closure $callback, $boolean = 'and', $not = false)
{
$query = $this->forSubQuery();
// Similar to the sub-select clause, we will create a new query instance so
// the developer may cleanly specify the entire exists query and we will
// compile the whole thing in the grammar and insert it into the SQL.
call_user_func($callback, $query);
return $this->addWhereExistsQuery($query, $boolean, $not);
}