我正在尝试根据文档使用预先加载来在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
函数的行为。
答案 0 :(得分:2)
试试这个,看看它是否有多个查询
$session = LeadSession::join('leads', 'leads.id', '=', 'lead_sessions.lead_id')
->where('token',$token)
->firstOrFail();
我希望它只运行一个查询。我没有测试过这个。不确定是否必须添加select()
来选择列。但是,先试试这个。
<强>更新强> 只需添加如何使用会话和潜在客户数据。尝试选择并指定所需的数据。原因是如果两个表都有类似“id”的列,则其中一个将被覆盖。所以你必须为你的选择别名
$session = LeadSession::join('leads', 'leads.id', '=', 'lead_sessions.lead_id')
->where('token',$token)
->select(
'lead_sessions.*',
'leads.id as lead_id',
'leads.name',
'leads.more_stuff'
)
->firstOrFail();
现在所有这些数据都属于$session
变量。对于您正在进行的测试
print($lead->session->id);
//becomes
print($session->lead_id); //we aliased this in the query