奇怪的问题:试图在 Laravel Blade 中获取 属性 'name' of non-object

Weird Problem: Trying to get property 'name' of non-object in Laravel Blade

我有四个表:用户、国家、地区和乡镇。

在User.php模型中,

public function country() {
    return $this->belongsTo(Country::class, 'country_id');
}

public function region() {
    return $this->belongsTo(Region::class, 'region_id');
}

public function township() {
    return $this->belongsTo(Township::class, 'township_id');
}

在 Country.php、Region.php 和 Township.php 模型中,

public function users() {
    return $this->hasMany(User::class);
}

在users.blade中,我尝试打印用户的位置

{{ $user->township->name }}, {{ $user->region->name }}, {{ $user->country->name }}

而且,我遇到了 Trying to get property 'name' of non-object 异常。

当我尝试像 {{ $user->township->name }}, {{ $user->region->name }}, {{ $user->country->name }} 一样打印 countryregiontownship 时,它打印如下 -

{"id":1,"region_id":1,"name":"Hlaing"}, {"id":1,"country_id":1,"name":"Yangon"}, {"id":1,"name":"Myanmar"}

只在远程服务器上出现这个异常,在本地机器上没有问题。

我有所有用户、已批准用户和待定用户的三个视图。我有 users.blade.php、users_approved.blade.php 和 users_pending.blade.php。这些刀片相似,只有标题文本不同。在已批准的用户视图中没有问题(远程服务器也一样)。

在MainController.php中,我有那些函数-

function users(Request $request) {
    $users = User::all();

    return view('users', [ 'users' => $users ]);
}

function users_approved(Request $request) {
    $users = User::where('approval_status', 'APPROVED')->get();

    return view('users_approved', [ 'users' => $users ]);
}

function users_pending(Request $request) {
    $users = User::where('approval_status', 'PENDING')->get();

    return view('users_pending', [ 'users' => $users ]);
}

我已经试过了 - php artisan view:clear, php artisan cache:clear, php artisan config:clear.

如果您的问题只发生在远程机器上,可能是因为那里存储的数据不同。特别是对于某些用户,由于某些原因(遗留记录、代码错误、未使用事务...等),他们的某些关系可能只是未设置。

Eloquent docpage itself 上建议的一种解决方法是为那些绑定模型提供默认值,当数据库中缺少关系时使用。例如:

public function country() {
    return $this->belongsTo(Country::class, 'country_id')->withDefault([
      'name' => 'Country Not Set',
    ])
}

public function region() {
    return $this->belongsTo(Region::class, 'region_id')->withDefault([
      'name' => 'Region Not Set',
    ])
}

... 等。另一种选择是 运行 数据库查询,以获取具有以下条件的远程加工中的所有用户:

WHERE country_id IS NULL 
   OR region_id IS NULL 
   OR township_id IS NULL

根据您的需要,您可以修改这些记录或以某种方式禁用它们。