-2

所以,我正在尝试学习 laravel,但我有点陷入了一对多的关系。所以,我有一个带有 3 个链接的页面,并通过单击这些链接登录到数据库。一切都好,我点击链接,它在数据库中注册链接的 id,但是当我尝试在视图中打印它们时,我得到“试图获取非对象的属性”。

我的模型:

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 表:

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

nice_actions 表:

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

3 回答 3

0

您的getHome()方法具有以下行:

$logged_actions = NiceAction::all();

我假设这实际上是:

$logged_actions = NiceActionLog::all();

由于更正此错误后仍然出现错误,因此您可能有一条NiceActionLog没有关联记录的NiceAction记录。因此,$loggedAction->logwill be null,然后$loggedAction->log->name会给你你看到的错误。

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

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

根据您对表定义的更新,您的belongsTo关系未正确定义。关系的belongsTo一方根据关系方法的名称构建外键名称。您已将关系方法命名为log(),因此它将在nice_actions_logs名为 的表中查找字段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一方根据类名构建外键名,所以既然你的类是named NiceAction,它就会去寻找nice_action_id字段,这是正确的。无需更改此关系定义或名称。

于 2016-08-30T19:58:40.910 回答
0

试试这个代码来查看$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
于 2016-08-30T20:17:50.723 回答
0

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

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

    }
}
于 2016-08-30T21:16:54.687 回答