我创建了一个工匠自定义命令,在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');
}
}
答案 0 :(得分:0)
正如@aynber上面所述,如果数据库字段user
。summoner_id
可以设置为NULL,那么就会有没有相关Summoner
的用户。
因此,您可以使用QueryBuilder的whereHas
方法,该方法将检查关系summoner
是否存在:
$users = User::whereHas('summoner')->get();
foreach($users as $user) {
$this->line($user->summoner->summoner_id);
}
或者您可以为每个选定的用户检查关系summoner
的existens,但是这种方法可以从DB中选择冗余数据(如果您需要所有具有非NULL summoner_id
字段的用户):
$users = User::all();
foreach($users as $user) {
if(empty($user->summoner)){
continue;
}
$this->line($user->summoner->summoner_id);
}
您可以在此处找到有关whereHas
方法的更多信息:
<小时/> 唯一奇怪的是,就像你说的那样(如果我告诉你的话),非工匠&#34;常规&#34;控制器相同的代码执行没有错误。可能,这只是一个巧合:可能是当您在非CLI(命令行输入)控制器中检查了您的代码时,所有用户都有一个召唤器。