当前位置: 首页 > 知识库问答 >
问题:

如何使用一个SQL查询获取Laravel(Eloquent)中的两个相关对象

杨和蔼
2023-03-14

我正试图在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\u sessions表。

这样的事情在雄辩中可能发生吗?在我看来,这应该是一个标准的ORM操作,但出于某种原因,我花了一整天的时间来处理它。

我不想使用查询生成器,因为我想在以后使用雄辩的对象及其函数。

我来自Python和Django,我想在Django中复制select_related函数的行为。

共有1个答案

冀翰翮
2023-03-14

试试这个,看看它是否进行了多个查询

$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
 类似资料:
  • 问题内容: 我正在尝试创建一个报告页面,以显示从特定日期到特定日期的报告。这是我当前的代码: 这在普通SQL中的作用是。 我在这里有此查询,但我不知道如何将其转换为雄辩的查询。 如何将上面的代码转换为雄辩的查询?先感谢您。 问题答案: 该方法验证列的值是否在两个值之间。 在某些情况下,您需要动态添加日期范围。根据@Anovative的评论,您可以执行以下操作: 如果您想添加更多条件,则可以使用。如

  • 问题内容: 使用Laravel 4,我有以下模型和关系:具有多记录的事件具有多项目的事件。我想做的是这样的 原因是无效的,因为Eloquent在检索记录时不会将模型联接在一起。因此,如何在不自己编写SQL的情况下解决这个问题(我想避免使用分页,但要避免这种情况)。 问题答案: 您想要的是渴望加载。 如果要指定其他约束,它的工作原理如下:

  • 我正在尝试创建一个报告页面,显示从特定日期到特定日期的报告。以下是我当前的代码: 这在普通SQL中的作用是。 我在这里有这个查询,但我不知道如何将其转换为雄辩的查询。 如何将上面的代码转换为雄辩的查询?提前谢谢你。

  • 问题内容: 我有两个表A和Band,A与B之间的关系是A —>一对多—> B 通常,对于A的每条记录,我都有一个B的记录。 我正在尝试编写一个查询,该查询将为我提供A的 唯一 记录列表,其中B中的 记录 超过 一个(多个) 。 我很困惑,因为我只完成了基本的sql查询,而这对我来说似乎很复杂。 可以请一个人指导我正确答案或给我解决方案。 编辑: 好吧,我尝试了下面的事情,它给了我一个错误 从A a

  • 我有两个查询,它们都是分开工作的,但是当我尝试统一下摆时,我只有问题。 查询1: 查询 2: 如何根据(内部一)统一它们?

  • 在SQL Server中,我有两个来自两个表的查询。 第一个表“Values1”有两列:“index1”和“value1”。第二个表“Values2”有“index2”和“value2”列。 我想要一个查询,对于一对索引值“d1”和“d2”,可以输出所有“index1”和“value e1”行,其中对应的index1在“d1”和“d2”之间,以及“Values2”表中具有“index2”值在“d1