Laravel 5.3 - HasMany关系不能使用Join语句

时间:2017-02-25 15:36:17

标签: php mysql laravel

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

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);

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

@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循环没有对每个符号的注释。知道为什么连接会引起这种情况吗?

1 个答案:

答案 0 :(得分: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被覆盖,它会破坏关系。

您必须小心,所有共享名称的字段都可以被覆盖并在模型中被错误地解析。