laravel5.1 使用 eloquent hasOne() 检索嵌套关系(一对一关系)

laravel5.1 retrieve nested relation using eloquent hasOne() (one to one relation)

我的table设计是:

users: | id  |username | ... |

tickets: | id | supp_id | ... |

ticket_replies: | id | ticket_id | user_id |

我的控制器看起来像:

用户:

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

门票:

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

public function supporter()
{
    return $this->hasOne('App\User', 'id','supp_id');
}

我的控制器看起来像这样:

$tickets =  Auth::user()->tickets()->orderBy('status', 'desc')->paginate(2);

return view('protected.ticketsList', [ 
    'tickets' => $tickets,
]);

在我看来我使用:

 supporter: {{ $ticket['supporter']->username }}

知道我哪里做错了吗?我一直收到这个错误:

Trying to get property of non-object

在我看来 table 之间的关系本身是正确的。 例如,当我在视图中使用 {{ dd($ticket) }} 时,我得到一个包含我需要的所有项目的对象:

所以首先,尝试访问 Ticket 模型上的函数 public function supporter() 不能使用数组语法来完成。变化:

{{ $ticket['supporter']->username }}

至:

{{ $ticket->supporter()->first()->username }}

如果您不想使用 ->first(),您可以执行以下两项操作之一。修改现有查询以包含 ->with("supporter") 语法:

$tickets = Auth::user()
           ->tickets()
           ->with("supporter")
           ->orderBy('status', 'desc')
           ->paginate(2);

然后像这样从视图访问支持者:

{{ $ticket->supporter->username }}
// Notice how supporter is no longer a `method` ->supporter() but a `property` ->supporter

或者您可以修改您的关系以包含更亲密的关系 ->first():

public function supporter(){
    return $this->hasOne('App\User', 'id','supp_id')->first();
}

然后像这样访问它:

{{ $ticket->supporter()->username }}
// Notice you no longer need `->first()`

因此,如您所见,有多种方法可以访问 TicketSupporter。请注意,您不能真正组合这些选项;修改函数以包含 ->first() 然后尝试使用 ->with() 将 return 出错,因此选择一个或另一个。

希望对您有所帮助!