【问题标题】:Laravel Query Builder by Distant relations idLaravel Query Builder 按远程关系 id
【发布时间】:2018-02-08 17:34:10
【问题描述】:

我有 3 个模型

Language: id,name.                Table: languages.|
Variant:id,name, language_id.    Table:variants.|
Symbol: id, name, variant_id.     Table :symbols.

Relations:
Language->hasMany->Variant.|
Variant->hasMany->Symbol.|
Language->hasManyThrough->(Symbol,Variant)

我想通过 language_id 找到属于一种语言的所有符号,并从控制器传递一个 $symbols 查询生成器对象分页到我的视图

我尝试了类似的东西

$variants=Variant::with('symbol')->where('language_id',"=",$language_id)->get();
$symbols= collect(new Symbol);
foreach($variants as $variant){
$symbols->push($variant->symbol()->paginate(10));
}

return view(symbols.index,compact($symbols))

在视图中,我只是在 foreach 中回显查询的项目 @foreach($symbols as $item) {{ $item->name; }}

这会在视图中引发错误,因为传递的对象是一个集合而不是 Query 返回的结果。

如何将此集合转换为查询生成器结果?

【问题讨论】:

  • 只是不要调用->get(),这会给你构建器实例。
  • 删除 get() 会在视图中引发错误 Method appends does not exist. 我只是在此处回显变量。还有其他方法可以实现吗?新的集合和 foreach 会创建一个同样不能分页的集合对象。
  • 你能把代码贴在你的视图里吗?
  • ` @foreach($symbols as $item) {{$item->name}} ` .我只是在 foreach 的视图中呼应它们。
  • 我认为我发布的查询应该可以解决问题@user1099253

标签: laravel eloquent views relationships laravel-paginate


【解决方案1】:

试试这样的

$symbols = Symbol::whereHas('variant', function ($query) use ($language_id) {
    $query->where('language_id', $language_id);
})->paginate(10);

return view('index', ['symbols' => $symbols]);

【讨论】:

  • 基本上,您在第一次尝试时以相反的方式开始,这意味着您应该从您想要获取的对象开始构建查询,在这种情况下是 Symbol,因此是一种自然的方式检索所有符号是通过查询它们,而不是变体。函数 whereHas 检索所有具有关系的模型,也就是它不为空,如果您将函数作为第二个参数传递给 whereHas,那么您将查询 Variant 表,所以基本上我们首先检索所有具有 Variant 的符号语言标识。希望这可以澄清它
猜你喜欢
  • 2021-02-07
  • 2020-03-05
  • 1970-01-01
  • 2016-12-10
  • 2018-12-10
  • 2020-06-04
  • 2019-08-11
  • 2015-03-21
  • 1970-01-01
相关资源
最近更新 更多