试图在一对多关系上获得 属性 个非对象

Trying to get property of non-object on one to many relationship

所以,我正在努力学习 laravel,但我有点陷入一对多关系。所以,我有一个包含 3 links 的页面,然后单击那些 links 登录数据库。很好,我单击 link,它在数据库中注册了 link 的 ID,但是当我尝试在视图中打印它们时,我得到 "Trying to get property of non-object".

我的模特:

class NiceAction extends Model
{
    public function logs(){

        return $this->hasMany('App\NiceActionLog');

    }
}

class NiceActionLog extends Model
{
    public function log(){

        return $this->belongsTo('App\NiceAction');

    }
}

我的控制器:

这是我在点击时登录数据库的方式:

public function getNiceAction($action, $name = null){
    if ($name == null) {
        $name = 'you';
    }
    $nice_action = NiceAction::where('name', $action)->first();
    $nice_action_log = new NiceActionLog();
    $nice_action->logs()->save($nice_action_log);
    return view('actions.nice', ['action' => $action, 'name' => $name]);
}

这就是我将日志传递给视图的方式:

public function getHome(){
        $actions = NiceAction::all();
        $logged_actions = NiceActionLog::all();
        return view('home', ['actions' => $actions, 'logged_actions' => $logged_actions]);
    }

我认为这是:

    @foreach($logged_actions as $loggedAction)
            <li>{{ $loggedAction->log->name}}</li>
    @endforeach

后期编辑:

如果这可能是问题所在,我的表格如下所示:

nice_action_logs table:

public function up()
{
    Schema::create('nice_action_logs', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->integer('nice_action_id');
    });
}

nice_actions table:

public function up()
{
    Schema::create('nice_actions', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->string('name');
        $table->integer('niceness');
    });
}

您的 getHome() 方法包含以下行:

$logged_actions = NiceAction::all();

我假设这实际上是:

$logged_actions = NiceActionLog::all();

由于您在更正此错误后仍然收到错误,您可能有一个 NiceActionLog 记录没有关联的 NiceAction 记录。因此,$loggedAction->log 将是 null,然后 $loggedAction->log->name 会给出您所看到的错误。

您可以在尝试访问 属性 之前检查日志是否存在:

@foreach($logged_actions as $loggedAction)
    <li>{{ $loggedAction->log ? $loggedAction->log->name : 'No Log' }}</li>
@endforeach

根据您对 table 定义的更新,您的 belongsTo 关系定义不正确。关系的 belongsTo 端基于关系方法的名称构建外键名称。您已将关系方法命名为 log(),因此它将在 nice_actions_logs table 上查找名为 log_id 的字段。您要么需要重命名您的关系方法以匹配外键字段,要么您需要传递外键字段以用作第二个参数。

class NiceActionLog extends Model
{
    // change the relationship method so the foreign key name will be correct
    public function nice_action() {
        return $this->belongsTo('App\NiceAction');
    }
}

class NiceActionLog extends Model
{
    // leave relationship method alone, but supply the foreign key to the relationship
    public function log() {
        return $this->belongsTo('App\NiceAction', 'nice_action_id');
    }
}

关系的 hasMany 端基于 class 名称构建外键名称,因此由于您的 class 被命名为 NiceAction,它将查找nice_action_id 字段,这是正确的。无需更改此关系定义或名称。

尝试使用此代码查看 $loggedAction 真正包含的内容:

@foreach($logged_actions as $loggedAction)
    <li>{{ var_dump($loggedAction)}}</li>
@endforeach

然后,查看输出,看看有什么问题。

可能的答案:

  1. $loggedAction->log 可能是 null
  2. $loggedAction 可能是一个数组(不太可能)

你可以像这样在放置之前检查日志变量:

@foreach($logged_actions as $loggedAction)
    <li>
    @if (property_exists($loggedAction->log,"name"))
        {{$loggedAction->log->name}}
    @else
        No Log
    @endif
</li>
@endforeach

好的,我知道了。我已将我的模型更改为这些,现在可以使用了:

class NiceAction extends Model
{
    public function NiceAction(){ //changed function's name

        return $this->hasMany('App\NiceActionLog');

    }
}

class NiceActionLog extends Model
{
    public function NiceActionLog(){ // changed function's name

        return $this->belongsTo('App\NiceAction', 'nice_action_id'); // added nice_action_id parameter

    }
}