所以,我正在努力学习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');
});
}
答案 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
然后,查看输出,看看有什么不对。
可能的答案:
null
您可以在这样之前检查日志变量:
@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
}
}