2017-03-13 4 views
0

Ich habe eine benutzerdefinierte benutzerdefinierte Befehl erstellt und in der Handle() -Methode muss ich ein paar Informationen über die Benutzer erhalten.Kann nicht Modellbeziehung in Handwerker benutzerdefinierte Befehl Laravel 5.4

Wenn ich laufe:

handle() { 
    $users = User::all(); 
    foreach($users as $user) { 
     $this->line($user->name); 
    } 
} 

es funktioniert, aber ich brauche so etwas wie:

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

und ich bekomme Versuch Eigenschaft Nicht-Objekt zu erhalten.

Wenn ich den gleichen Code oben in einem Controller ausführen, funktioniert es gut.

Hat jemand eine Idee?

User-Modell:

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'); 
    } 

Summoner Modell:

<?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

Zeigen Sie Ihre Modelle und Beziehungen. – aynber

+0

Ok, oben bearbeitet –

+0

Versuchen Sie, '$ users' in Protokollen auszugeben. Sehen Sie, was genau Sie in Variable bekommen haben. Dies kann auch passieren, wenn ein Benutzer keine Telefonnummer hat. –

Antwort

0

Als @aynber metnioned oben, wenn DB Feld user. summoner_id kann auf NULL gesetzt werden, dann gibt es Benutzer ohne verwandte Summoner.

So können Sie whereHas Methode der Querybuilder verwenden, die Beziehung überprüfen wird summoner Existenz:

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

Oder Sie können existens der Beziehung überprüfen summoner Benutzer für jeden ausgewählten, aber dieser Ansatz wählen können redundante Daten aus DB (wenn Sie alle Benutzer mit nicht-NULL summoner_id Feld benötigen):

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

können Sie weitere Informationen über whereHas Methode finden, die er re:


Die einzige seltsame Sache, dass, wie Sie gesagt hat (wenn ich Sie recht verstehe), in Nicht-Handwerker "normale" Steuerung des Derselbe Code wird ohne Fehler ausgeführt. Möglich, es ist nur ein Zufall: möglicherweise, wenn Sie Ihren Code in Nicht-CLI (Command Line Input) -Controller überprüft haben, hatten alle Benutzer einen Beschwörer.

+0

Wenn meine Antwort hilfreich war, markieren Sie sie bitte als Lösung und stimmen Sie ab. –

Verwandte Themen