【问题标题】:Laravel 5.3 - HasMany Relationship not working with Join statementLaravel 5.3 - HasMany 关系不适用于 Join 语句
【发布时间】:2017-02-25 23:56:28
【问题描述】:

我正在尝试使用 laravel 5.3 中的 hasMany 检索带有 cmets 的符号

Symbol.php

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

Comment.php

public function symbol() {
    return $this->belongsTo('App\Symbol');
}

当我跑步时:

$symbols = Symbol::with('comments')->paginate(100);

我得到正确的输出(列出所有符号及其 cmets)

@foreach ($symbols as $s)
    {{ $s->name }}
    @foreach ($s->comments as $c)
         {{ $c->body }}
    @endforeach
@endforeach

但是当我在语句中添加一个连接时:

$symbols = Symbol::with('comments')
    ->join('ranks', 'symbols.id', '=', 'ranks.symbol_id')
    ->join('prices', 'symbols.id', '=', 'prices.symbol_id')
    ->paginate(100);

foreach 循环没有每个符号的 cmets。知道为什么加入会导致这种情况吗?

【问题讨论】:

  • 为什么不将它们也添加为关系?
  • “知道为什么加入会导致这种情况” - 我猜 Symbol 的 id 被排名或价格的 id 覆盖。解决方案取决于您要执行的操作。
  • 我认为这是错误的。当我添加一个仅包含 symbols.id 的选择时,它起作用了。谢谢

标签: php mysql laravel


【解决方案1】:

当你像这样进行连接时,如果没有选择,同名的属性将被覆盖。因此,选择您的代码所需的属性,仅此而已。如下图。

$symbols = Symbol::with('comments')
    ->join('ranks', 'symbols.id', '=', 'ranks.symbol_id')
    ->join('prices', 'symbols.id', '=', 'prices.symbol_id')
    ->select('symbols.*', 'ranks.importantAttribute', 'prices.importantAttribute')
    ->paginate(100);

基本上我认为你的 id 被两个连接覆盖了,因为它们也有 id 字段,我在连接时遇到了类似的问题,如果 id 被覆盖,它会破坏关系。

而且你必须小心,所有共享名称的字段都可能被覆盖并错误地解析到模型中。

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 2020-03-27
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2021-12-21
    • 2017-05-10
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多