我有Laravel文档中的这个片段:
DB::table('users')
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('orders')
->whereRaw('orders.user_id = users.id');
})
->get();
我需要了解两件事。
$query
参数来自哪里?我怀疑在幕后发生了一些我不明白的事情。该函数采用1个参数$query
,但它来自何处,该函数如何知道此参数中的内容,传递给函数的内容是什么?return
语句。那么whereExists
方法如何知道闭包的返回值呢?答案 0 :(得分:2)
正如您所看到的,闭包被视为回调。
因此whereExists
将$query
传递给它。 $query
是self(Builder)类的实例,因此闭包中的代码只是更新对象。
/**
* 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);
}