Php 尝试获取一对多关系上非对象的属性

Php 尝试获取一对多关系上非对象的属性,php,laravel,laravel-5.3,Php,Laravel,Laravel 5.3,所以,我正在努力学习拉威尔和我的一对多关系。因此,我有一个页面,上面有3个链接,点击这些链接登录数据库。很好,我点击链接,它在数据库中注册链接的id,但当我试图在视图中打印它们时,我得到“试图获取非对象的属性” 我的模型: class NiceAction extends Model { public function logs(){ return $this->hasMany('App\NiceActionLog'); } } class NiceA

所以,我正在努力学习拉威尔和我的一对多关系。因此,我有一个页面,上面有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_行动表:

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


关系的
有许多
端基于类名构建外键名,因此,由于类名为
NiceAction
,它将查找正确的
NiceAction\u id
字段。无需更改此关系定义或名称。

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

@foreach($logged_actions as $loggedAction)
    <li>{{ var_dump($loggedAction)}}</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

    }
}

哦,是的。谢谢你。我在主要帖子中编辑。但是我仍然会遇到同样的错误,因为它没有为日志表中的每一行打印日志。@IonuțZamfir我已经根据您问题中的附加信息更新了我的答案。哦。现在这是有道理的。我把这个标记为答案。谢谢你的帮助。当我做var_转储时,它给了我这个我不知道它是什么意思的东西:当我做你的@foreach时,我没有得到每个li的日志。但是当我做{{$loggedAction}时,我从dba中的log表中得到确切的数据,当我做{$loggedAction->log}时,它给我的LI数等于log表中的行数,但在它们上面没有任何内容,所以我猜$loggedAction->log为null,但我不知道我做错了什么。什么将
{dd($loggedAction->log()->toSql())}
return?为什么调用关系
NiceActionLog()
?它返回一个
NiceAction
对象。因此,您应该将其命名为
NiceAction()
NiceAction()
action()
。看起来函数名必须与表名相同才能工作。由于我的选项卡名为NiceAction和NiceActionLog,所以函数名为。你可以给关系起任何你想要的名字。但惯例是将其命名为与相关模型相同的名称。
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');
    }
}
@foreach($logged_actions as $loggedAction)
    <li>{{ var_dump($loggedAction)}}</li>
@endforeach
@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

    }
}