我试图在laravel中的foreach玩家中访问角色扮演关系,但它每次都向我抛出一个Undefined属性错误,有人可以帮助我吗?
我的代码很好,直到它涉及@if涉及 - > roleplay
@foreach ($players as $key => $player)
<tr id="tr_player_{{ $player->id }}">
<td>{{ $player->id }}</td>
<td>{{ $player->username }}</td>
<td>{{ $player->mail }}</td>
<td>{{ $player->ip_last }}</td>
<td>{{ Carbon\Carbon::parse($player->created_at)->diffForHumans() }}</td>
<td>
@if ($player->roleplay->current_working == '1')
Working
@elseif ($player->roleplay->currently_jailed == '1')
Jailed
@elseif ($player->roleplay->currently_dead == '1')
Dead
@elseif ($player->roleplay->currently_wanted == '1')
Wanted
@else
Alive
@endif
</td>
</tr>
@endforeach
玩家类:
use Hash;
use Eloquent;
use \Illuminate\Auth\Authenticatable;
use \Illuminate\Contracts\Auth\Authenticatable as Authentication;
class Player extends Eloquent implements Authentication
{
use Authenticatable;
protected $primaryKey = 'id';
protected $table = 'users';
public $timestamps = false;
protected $fillable = [];
public function setPasswordAttribute($value)
{
$this->attributes['password'] = Hash::make($value);
}
public function setUsernameAttribute($value)
{
return $this->attributes['username'] = $value;
}
public function roleplay()
{
return $this->hasOne('App\Database\Website\User\Roleplay', 'user_id');
}
}
角色扮演课程:
<?php
namespace App\Database\Website\User;
use Eloquent;
class Roleplay extends Eloquent
{
protected $primaryKey = 'user_id';
protected $table = 'srp_user_statistics';
public $timestamps = false;
protected $fillable = [];
public function user()
{
return $this->belongsTo('App\Database\Website\User\Player', 'user_id', 'id');
}
public function government_role()
{
return $this->belongsTo('App\Database\Website\Roleplay\GovernmentRole', 'government_id');
}
}
我是如何获得$ players系列的?
$players = Player::orderBy('id', 'desc')->get();
这是我的dd方法的结果
array:11 [▼
0 => array:44 [▶]
1 => array:44 [▶]
2 => array:44 [▶]
3 => array:44 [▶]
4 => array:44 [▶]
5 => array:44 [▶]
6 => array:44 [▶]
7 => array:44 [▶]
8 => array:44 [▶]
9 => array:44 [▶]
10 => array:44 [▼
"id" => 1
"username" => "Liam Savage"
"password" => "$2y$10$axynRJSDIRnRch5w5CjcV.3pTdAprjKOZNri0vniRANXPce/74DFK"
"mail" => "[email protected]"
"last_change" => 0
"machine_id" => "~203c89fda517afe6d0e99494e00fe7b6"
"updated_at" => "2016-11-14 00:30:36"
"created_at" => "2016-07-25 03:45:44"
"remember_token" => "hG1QZE3fPQphjPhcWeZ4ifeZYiKbJBvPIZKSL8xXkuJPXh4ukrodfMRjyvn0"
"last_admin_login" => "Mon, Jan 30, 2017 11:43 AM"
]
]
当$players
系列中的玩家没有角色扮演时,你会得到那个错误。如果您只想加载带有角色扮演的玩家,您可以将玩家查询更新为:
$players = Player::has('roleplay')->with('roleplay')->orderBy('id', 'desc')->get();
如果你想加载所有,那么你需要更新你的刀片视图以检查是否存在角色扮演,然后像@aimme在他的回答中所说的那样访问它。
无论哪种方式,你肯定应该懒惰加载这种关系。您最初拥有它的方式是,您在视图中遇到N + 1问题并为每个玩家运行新查询以检索其角色扮演。为了延迟加载角色扮演,请将您的查询更新为:
$players = Player::with('roleplay')->orderBy('id', 'desc')->get();
这是因为你试图访问$ player-> roleplay的属性,而没有 - > roleplay。所以$ player-> roleplay将为null,并且您正在检查null。在尝试访问它的属性之前检查它是否存在。
@if($player->roleplay)
@if ($player->roleplay->current_working == '1')
Working
@elseif ($player->roleplay->currently_jailed == '1')
Jailed
@elseif ($player->roleplay->currently_dead == '1')
Dead
@elseif ($player->roleplay->currently_wanted == '1')
Wanted
@else
Alive
@endif
@endif
你也可以这样做
@foreach ($players as $player)
而不是这个
@foreach ($players as $key => $player)