Php 尝试获取一对多关系上非对象的属性
所以,我正在努力学习拉威尔和我的一对多关系。因此,我有一个页面,上面有3个链接,点击这些链接登录数据库。很好,我点击链接,它在数据库中注册链接的id,但当我试图在视图中打印它们时,我得到“试图获取非对象的属性” 我的模型: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
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
}
}