【问题标题】:Laravel / Eloquent: Is it possible to select all child model data without setting a parent?Laravel / Eloquent:是否可以在不设置父级的情况下选择所有子模型数据?
【发布时间】:2019-08-06 13:59:18
【问题描述】:

我有各种父/子关系,向下钻取了几个级别。我想知道的是是否可以做这样的事情:

$student = Student::find(1);
$student->bursaries()->enrolments()->courses()->where('course','LIKE','%B%');

(最终目标是选择类似于“%B%”的课程),或者我是否必须改用带有连接的数据库查询构建器?

模型/关系

学生:

public function bursaries() {
    return $this->hasMany('App\StudentBursary');
}

学生助学金:

public function enrolments() {
    return $this->hasMany('App\StudentBursaryEnrolment');
}

【问题讨论】:

  • 你试一试了吗?)它对我有用,深度为 2 级。
  • 使用 php artisan tinker,它失败了 - 但我不知道它是否是另一个问题和/或特定于修补程序:>>> $student->bursaries()->enrolments()->courses() ->where('课程','LIKE','%B%'); BadMethodCallException 并带有消息“调用未定义的方法 Illuminate/Database/Eloquent/Relations/HasMany::enrolments()”
  • 您在 Tinker 中遇到了哪些错误?
  • 你能用这些关系方法展示所有模型吗?顺便说一句,如果您的数据库不是那么大,请尝试在数据库级别上获取您需要的内容。无论如何可能会更快。
  • 阅读 Has Many Through 关系 laravel 文档。我想可以帮到你。

标签: laravel eloquent


【解决方案1】:

如果你想要查询所有courses来自所有enrollments来自所有bursaries来自students,那么,不幸的是,您与Has Many Through 关系相处得太多,因为它只支持3 个表。

在线,您会找到可以导入的软件包/或可以遵循的答案,以便为您提供更多解决方案,例如:

1) How to use Laravel's hasManyThrough across 4 tables

2) https://github.com/staudenmeir/eloquent-has-many-deep

无论如何,您可以通过以下方式单独使用 Laravel 来实现这一目标:

// Eager loads bursaries, enrolments and courses, but, condition only courses.
$student = Student::with(['bursaries.enrolments.courses' => function($query) {
    $query->where('course','LIKE','%B%');
}])->find(1);

$enrolments = collect();

foreach($student->bursaries as $bursary)  {
    $enrolments = $enrolments->merge($bursary->enrolments);
}

$courses = collect();

foreach ($enrolments as $enrolment) {
    $courses = $courses->merge($enrolment->courses);
}

【讨论】:

  • 太棒了——按预期工作!我如何将变量传递给查询?
  • 为了澄清,下面说 $row 在 $query 行中未定义: foreach ($rows as $row) { $student = Student::with(['bursaries.enrolments.courses' = > function($query) { $query->where('course','=',$row[3]); }])->find($row[0]); }
  • 没关系!答案是将function($query)改为function($query) use ($row)
  • 很高兴我能帮上忙
【解决方案2】:

当您执行$student->bursaries() 而不是$student->bursaries 时,它会返回query builder 而不是relationship map。所以要从bursaries() 转到enrolments(),你需要做一个bursaries()->get()。它应该是这样的。

$student->bursaries()->get()[0]->enrolments(),添加了[0],因为我使用get(),你可以使用first()来避免[0]

$student->bursaries()->first()->enrolments() 但我不确定它是否满足您的要求。

【讨论】:

  • 谢谢,虽然这可能有效(没有尝试过) - 它唯一获得(第一个)父母 - 我要问的是是否可以从本质上搜索“所有”子记录。跨度>
  • @SupaMonkey 如果您能提及您与模型建立的关系以及您想要实现的目标,我可以帮助您
  • 我已经编辑了主要问题以包含关系。基本上,我正在尝试从学生所拥有的课程列表中选择类似于“%B%”的“课程”。
猜你喜欢
  • 1970-01-01
  • 2013-11-07
  • 2015-02-10
  • 2012-10-14
  • 2011-10-05
  • 1970-01-01
  • 2018-01-03
  • 2017-08-04
  • 2019-07-05
相关资源
最近更新 更多