试图在一对多关系

时间:2016-08-30 19:37:47

标签: php laravel laravel-5.3

所以,我正在努力学习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]);
}

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

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

LATER EDIT:

如果这可能是问题,我的表格看起来像这样:

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');
    });
}

3 个答案:

答案 0 :(得分:0)

您的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

根据您对表定义的更新,您的belongsTo关系未正确定义。关系的belongsTo侧基于关系方法的名称构建外键名称。您已将关系方法命名为log(),因此它会在名为nice_actions_logs的{​​{1}}表中查找字段。您需要重命名关系方法以匹配外键字段,或者您需要传递外键字段作为第二个参数。

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,因此它将查找NiceAction字段,即正确。无需更改此关系定义或名称。

答案 1 :(得分:0)

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

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

然后,查看输出,看看有什么不对。

可能的答案:

  1. $ loggedAction-&gt;日志可能是null
  2. $ loggedAction可能是一个数组(不太可能)
  3. 您可以在这样之前检查日志变量:

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

答案 2 :(得分: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

    }
}