试图在一对多关系上获得 属性 个非对象
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
然后,查看输出,看看有什么问题。
可能的答案:
- $loggedAction->log 可能是
null
- $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
}
}
所以,我正在努力学习 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
然后,查看输出,看看有什么问题。
可能的答案:
- $loggedAction->log 可能是
null
- $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
}
}