You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中获取登录用户联系人列表报错:尝试获取非对象的'name'属性

Fixing "Trying to get property 'name' of non-object" in Laravel Contact List

咱先拆解下这个错误:它说明你代码里某个地方在尝试访问一个不是对象的name属性,大概率是多对多关联没配置对,或者视图里的变量逻辑出问题了。结合你的表结构和文件,咱一步步来解决:

1. 先把模型的多对多关联搞对

因为你用了contact_user中间表实现User和Contact的多对多,两个模型的关联定义必须准确:

User.php

namespace App\Models; // Laravel8+默认命名空间,老版本可能是App\

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    // 其他默认代码...

    // 定义用户关联的联系人
    public function contacts()
    {
        // Laravel会自动识别中间表contact_user(按字母顺序的模型复数组合)
        return $this->belongsToMany(Contact::class);
    }
}

Contact.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    // 其他默认代码...

    // 定义联系人关联的用户
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}

你的表结构是符合Laravel默认规则的,所以不用额外指定中间表或外键参数。

2. 控制器里要正确获取登录用户的联系人

确保你在ContactsController里正确拿到登录用户的联系人集合,再传给视图:

ContactsController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;

class ContactsController extends Controller
{
    public function list()
    {
        // 先确保用户已登录,未登录则跳转至登录页
        if (!Auth::check()) {
            return redirect()->route('login');
        }

        // 直接通过登录用户模型获取关联的联系人集合
        $contacts = Auth::user()->contacts;

        // 将集合传递给视图
        return view('contacts.list', compact('contacts'));
    }
}

这里要注意:Auth::user()->contacts返回的是Eloquent集合(哪怕没有联系人,也是空集合而非null),这样视图处理起来更安全。

3. 视图里要正确循环集合,还要处理空数据的情况

错误很可能出在视图里,比如忘记循环直接访问属性,或者把对象当数组处理。咱改成安全的写法:

list.blade.php

<h2>我的联系人列表</h2>

{{-- 先判断是否有联系人 --}}
@if($contacts->isEmpty())
    <p>目前还没有添加任何联系人哦~</p>
@else
    <ul class="contact-list">
        {{-- 循环每个联系人对象 --}}
        @foreach($contacts as $contact)
            <li>
                <strong>{{ $contact->name }}</strong>
                <span>{{ $contact->address }}</span>
            </li>
        @endforeach
    </ul>
@endif

如果你之前写的是{{ $contact['name'] }}(把对象当数组用),或者直接{{ $contacts->name }}(未循环集合),都会触发那个错误。另外要确保视图里的变量名$contacts和控制器传递的一致。

4. 最后几个排查小技巧

  • 检查数据库contact_user中间表:确认登录用户的user_id和对应的contact_id是否已经正确关联。
  • 调试输出验证:在控制器里加一行dd(Auth::user()->contacts);,查看返回结果:如果是null,说明模型关联配置错误;如果是空集合,说明还没有关联联系人;如果是正常集合,那就是视图逻辑问题。
  • 确认模型命名空间:Laravel8+模型默认在App\Models下,老版本在App下,别写错了。

内容的提问来源于stack exchange,提问作者Biswajit Chopdar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:51:42