2017-03-13 8 views
0

장인 커스텀 커맨드를 만들었고 handle() 메소드에서 사용자에 관한 정보를 얻을 필요가 있습니다.장인 커스텀 커맨드에서 모델 관계를 얻을 수 없습니다. Laravel 5.4

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

모델과 관계를 표시하십시오. – aynber

+0

좋아, 편집 완료 –

+0

'$ users'를 로그에 덤프하십시오. 변수가 정확히 무엇인지 확인하십시오. 또한 어떤 사용자에게 전화 번호가 없다면 발생할 수 있습니다 –

답변

0

는 @aynber는 DB 필드 user 경우, 위의 metnioned으로. summoner_id을 NULL로 설정할 수 있습니다. 관련없는 사용자가있는 경우 Summoner입니다.

그래서 당신은 관계를 summoner 존재를 확인합니다 QueryBuilder의 whereHas 방법을 사용할 수 있습니다 : 모든 선택한 사용자에 대한 관계 summoner

$users = User::whereHas('summoner')->get(); 
foreach($users as $user) { 
    $this->line($user->summoner->summoner_id); 
} 

아니면 확인할 수 있습니다 existens을하지만,이 방법은에서 중복 데이터를 선택할 수 있습니다 (당신이 NULL이 아닌 summoner_id 필드 모든 사용자가 필요로하는 경우) DB는 :

$users = User::all(); 
foreach($users as $user) { 
    if(empty($user->summoner)){ 
     continue; 
    } 
    $this->line($user->summoner->summoner_id); 
} 

을 좀 더 정보에 대한 whereHas 방법을 찾을 수 있습니다 그 재 :


유일한 이상한 것은, 당신은 (내가받을 경우 오른쪽)이 아닌 장인의를 "일반"컨트롤러 말했듯 동일한 코드가 오류없이 실행됩니다. 가능합니다. 단지 우연의 일치입니다. CLI가 아닌 (명령 줄 입력) 컨트롤러에서 코드를 검사했을 때 모든 사용자가 소환을했을 수 있습니다.

+0

내 대답이 도움이 되었다면 해결책으로 표시하고 투표를하십시오. –