【问题标题】:I can't retrieve data from the related table(model) in Laravel6我无法从 Laravel 6 中的相关表(模型)中检索数据
【发布时间】:2026-02-01 17:30:01
【问题描述】:

我无法从相关表中检索数据。

有 3 个模型(表)。

  • 用户
  • 啁啾(有'user_id'作为外键)
  • 单击(具有“chirp_id”作为外键)

然后我想从 Chirp 模型中检索 User & Click 的数据。 于是我写了:

啁啾.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Chirp extends Model
{
    public $timestamps = false;

    protected $guarded = [];

    public function user()
    {
        return $this->belongsTo('App\User');
    }

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

HomeController.php

class HomeController extends Controller
{

    public function index()
    {
        $chirps = Chirp::with(['user','clicks'])
        ->orderBy('posted_at', 'desc')
        ->get();

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

home.blade.php

@foreach($chirps as $chirp)
<div>
    <div>by
    <b>{{ $chirp->user->name }}</b>
        on
        <small>{{ $chirp->posted_at }}</small>
    </div>

    <div>
        <p>{{ $chirp->text }}</p>
        <p>{{ $chirp->click->ip_address }}</p>
    </div>
</div>
@endforeach

在 home.blade.php 中,{{ $chirp-&gt;click-&gt;ip_address }} 无法检索并出现错误“Facade\Ignition\Exceptions\ViewException Trying to get property 'ip_address' of non-object”

但是,如果我删除它,我可以正确检索{{ $chirp-&gt;user-&gt;name }}

为什么我不能从 Chirp 模型中检索 Click 模型,而我可以从 Chirp 模型中检索 User 模型?

谢谢。

【问题讨论】:

  • 可以有多次点击..所以你必须使用foreach
  • hasMany 关系上,您将获得集合而不是模态。因此,您将不得不遍历数据。它在 Laravel 文档中有很好的记录。 HasMany

标签: laravel eloquent-relationship


【解决方案1】:

要调试此问题,您可以采取以下步骤:

  1. 检查啁啾变量是否在控制器中有任何数据。

    dd($chirps);

  2. 如果您知道自己拥有数据,您可以采取措施使您的刀片变得更好。 因为它是多对多关系,所以您应该遍历数据。
    @foreach($chirps as $chirp)
    @foreach($chirp->clicks as $click)
                <div>
                    <p>{{ $chirp->text }}</p>
                    <p>{{ $click->ip_address }}</p>
                </div>
            @endforeach
    @endforeach

【讨论】:

    【解决方案2】:

    您与Chirpclicks 有很多关系

    在这里你得到了很多点击而不是点击

    @foreach($chirp->clicks as $click)
    <p>{{ $click->ip_address }}</p>
    @endforeach
    

    【讨论】:

      【解决方案3】:

      您还需要循环点击:

      @foreach($chirps as $chirp)
      <div>
          <div>by
          <b>{{ $chirp->user->name }}</b>
              on
              <small>{{ $chirp->posted_at }}</small>
          </div>
      
          @foreach($chirp->clicks as $click)
              <div>
                  <p>{{ $chirp->text }}</p>
                  <p>{{ $click->ip_address }}</p>
              </div>
          @endforeach
      </div>
      @endforeach
      

      【讨论】:

        【解决方案4】:

        啁啾有很多点击(不是点击)。你必须在你的刀片中 foreach $chirp-&gt;clicks

        @foreach ($chirp->clicks as $click)
            <p>This is click id {{ $click->id }}</p>
        @endforeach
        

        【讨论】: