2016-03-29 15 views
1

Betrachten Sie diese Modelle:Ignorieren Feld in ausgewählten Laravel Eloquent

Flugmodell

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Flight extends Model 
{ 
    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = 
    [ 
     'userID' 
    ];  

    public function user() 
    { 
    return $this->belongsTo('App\User', 'userID'); 
    } 
} 

Benutzermodell

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class User extends Model 
{ 
    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = 
    [ 
     'userID', 'username', 'address' 
    ];  
} 

ich eine Spalte überspringen wollen, wenn ich versuche, eifriges Laden verwenden. Ich will nur wissen, ob so etwas wie IGNORE_FIELD Funktion existiert, so kann ich so etwas tun:

$flightUser = Flight::with(['user', function ($q) 
{ 
    $q->ignoreField('user.address'); 
}]) 

Ich weiß, ich könnte das Adressfeld in die verborgene Array innerhalb des Benutzermodell schieben

protected $hidden = ['address']; 

oder tun Sie die $q->select('fields') und nicht einschließlich der Adresse Feld, aber meine wirkliche Zweifel ist, ob Laravel eine Funktion wie die oben eingegeben hat.

HINWEIS

ich ein Feld weiß, ist von einem Abkommen nicht so groß. Aber meine Frage ist eine vereinfachte Version meines wirklichen Problems.

Antwort

0

Ich denke, ich sehe, was Sie bekommen. Sie könnten die redegewandte Beziehung so ändern, dass sie dieses Feld niemals lädt.

class Flight extends Model { 

    public function user() 
    { 
     return $this->belongsTo('App\User', 'userID') 
      ->select(['userID', 'username']); 
    } 

} 

So wird diese Beziehung nie etwas außer der Benutzer-ID und Benutzernamen laden. Wenn Sie unterscheiden wollten, könnten Sie sogar die volle user() und die begrenzte userName() anrufen.

class Flight extends Model { 

    public function user() 
    { 
     return $this->belongsTo('App\User', 'userID'); 
    } 

    public function userName() 
    { 
     return $this->belongsTo('App\User', 'userID') 
      ->select(['userID', 'username']); 
    } 

} 
+0

Ja, das würde den Trick tun. Aber ich frage mich immer noch, ob Laravel so eine Funktion hat. Ich denke nicht – ggderas

+1

Nein, nicht meines Wissens. Ich habe vorher nach einem veritablen 'removeSelect()' gesucht, aber abgesehen von meiner Lösung oder manuell mit Auflistungsmethoden entfernen, gibt es in laravel keine solche Funktion. Ehrlich gesagt, wenn es so wichtig ist, ist es vielleicht besser, keine eloquente Beziehung zu verwenden und nur zwei Abfragen zu schreiben. –