无法在工匠自定义命令Laravel 5.4中获得模型关系

时间:2017-03-13 17:50:14

标签: php laravel command artisan

我创建了一个工匠自定义命令,在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');
    }
}

1 个答案:

答案 0 :(得分:0)

正如@aynber上面所述,如果数据库字段usersummoner_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(命令行输入)控制器中检查了您的代码时,所有用户都有一个召唤器。