【发布时间】:2017-03-08 06:42:46
【问题描述】:
我正在尝试根据文档使用预先加载在 Laravel 中获取两个相关对象。
https://laravel.com/docs/5.4/eloquent-relationships#eager-loading
我的模型是:
class Lead extends Model {
public function session() {
return $this->hasOne('App\LeadSession');
}
}
class LeadSession extends Model {
public function lead() {
return $this->belongsTo('App\Lead');
}
}
我想用一个 SQL 查询来获取这两个对象。基本上我想执行:
select * from lead_sessions as s
inner join lead as l
on l.id = s.lead_id
where s.token = '$token';
然后能够访问 LeadSession 和 Lead 对象。这是我正在尝试的 php 代码:
$lead = Lead::with(['session' => function ($q) use ($token) {
$q->where('token','=',$token);
}])->firstOrFail();
print($lead->session->id);
我也试过了:
$lead = Lead::whereHas('session', function($q) use ($token) {
$q->where('token','=',$token);
})->firstOrFail();
print($lead->session->id);
和
$session = LeadSession::with('lead')->where('token',$token)->firstOrFail();
print($session->lead->id);
在这三种情况下,我执行了两个查询,一个针对leads 表,另一个针对lead_sessions 表。
在 Eloquent 中这样的事情是可能的吗?在我看来,它应该是一个标准的 ORM 操作,但由于某种原因,我为此苦苦挣扎了一整天。
我不想使用查询生成器,因为我想在之后使用 Eloquent 对象及其函数。
我来自 Python 和 Django,我想在 Django 中复制 select_related 函数的行为。
【问题讨论】:
-
只是为了确保我理解您的问题,您希望
Eloquent只生成 1 个查询还是 2 个? -
@RossWilson,是的。两个模型都可以使用连接查询来检索