无法在工匠自定义命令 Laravel 5.4 中获取模型关系
Posted
技术标签:
【中文标题】无法在工匠自定义命令 Laravel 5.4 中获取模型关系【英文标题】:Can't get model relation in artisan custom command Laravel 5.4 【发布时间】:2017-08-03 20:34:49 【问题描述】:我创建了一个工匠自定义命令,在 handle() 方法中我需要获取一些关于用户的信息。
当我跑步时:
handle()
$users = User::all();
foreach($users as $user)
$this->line($user->name);
它有效,但我需要类似的东西:
handle()
$users = User::all();
foreach($users as $user)
$this->line($user->summoner->summoner_id);
我得到了尝试获取非对象的属性。
如果我在控制器中运行上面相同的代码,它就可以正常工作。
有人有想法吗?
用户模型:
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
use Notifiable;
protected $fillable = [
'name', 'email', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
public function summoner()
return $this->hasOne('App\Summoner');
召唤师模型:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Summoner extends Model
protected $table = 'summoners';
public $timestamps = true;
public function user()
return $this->belongsTo('App\User');
【问题讨论】:
展示你的模型和关系。 好的,上面已经编辑了 尝试在日志中转储$users
。看看你在变量中到底得到了什么。如果任何用户没有电话号码,也会发生这种情况
听起来好像所有的召唤师都有一个用户,但并不是所有的用户都有一个召唤师。在尝试打印之前验证 (if !empty($user->summoner)
)
您将电话号码编辑为其他内容。 (召唤者->召唤者_id)。尝试记录对象
【参考方案1】:
正如上面@aynber 提到的,如果DB 字段user
.summoner_id
可以设置为NULL,那么就有没有相关Summoner
的用户。
所以你可以使用 QueryBuilder 的whereHas
方法,它会检查关系summoner
是否存在:
$users = User::whereHas('summoner')->get();
foreach($users as $user)
$this->line($user->summoner->summoner_id);
或者您可以检查每个选定用户是否存在summoner
关系,但这种方法可能会从数据库中选择冗余数据(如果您需要所有具有非空summoner_id
字段的用户):
$users = User::all();
foreach($users as $user)
if(empty($user->summoner))
continue;
$this->line($user->summoner->summoner_id);
您可以在此处找到有关whereHas
方法的更多信息:
唯一奇怪的是,正如您所说(如果我没听错的话),在非工匠“常规”控制器中,相同的代码执行时没有错误。可能,这只是一个巧合:可能是当您在非 CLI(命令行输入)控制器中检查代码时,所有用户都有一个召唤者。
【讨论】:
如果我的回答有帮助,请将其标记为解决方案并投票。以上是关于无法在工匠自定义命令 Laravel 5.4 中获取模型关系的主要内容,如果未能解决你的问题,请参考以下文章