2016-07-18 160 views
5

Ho due tabelle: users, orders. Cerco di ottenere tutti gli ordini per l'utente corrente.Come ottenere i dati dalla tabella correlata in Laravel (uno a molti)?

Users Orders 
_____ ______ 
id | name id | user_id 

modello User:

public function orders(){ 
    return $this->hasMany("App\Order"); 
} 

Modello di ordine:

public function user(){ 
    return $this->hasOne("App\User", 'user_id', 'id'); 
} 

Query nel controllore:

public function index() 
{ 

    $orders = Order::where('user_id', Auth::guard('api')->id())->get(); 
    return response()->json(
     $orders->user 
    ); 
} 

Ottengo risultato NULL, faccio qualcosa di sbagliato, perché ci sono righe correlate in entrambe le tabelle.

+0

La funzione di controllo non funzionerà perché 'get()' metodo restituisce un insieme e si sta cercando di ottenere una proprietà 'user' di un collezione che non ha senso. Cosa dovrebbe fare quella funzione? –

+0

Quindi, ho bisogno di ottenere tutte le informazioni sull'utente dalla tabella 'Utenti' e ottenere nella stessa richiesta tutti gli ordini dell'utente. Cosa invece 'get()' dovrei usare? – Dev

+0

Cosa dire dell'uso di 'Auth :: user() -> id' invece di 'Auth :: guard (' api ') -> id()'? Ottengo null usando quello che hai. –

risposta

1

Se si desidera recuperare tutti gli ordini appartenenti a per l'utente corrente, provare a utilizzare la seguente funzione.

public function index() 
{ 
    $orders = Auth::user()->with('Orders')->get()->toArray();//To get the output in array 
    /*  ^   ^
    This will get the user | This will get all the Orders related to the user*/ 

    return response()->json($orders); 
} 

Come sottolineato da @ Martin Heralecký, si sarebbe anche bisogno di cambiare il hasOne() a belongsTo() nel Modello Ordine. Vedi seguente (copiato da @ Martin Heralecký risposta)

public function user(){ 
    return $this->belongsTo("App\User");// second and third arguments are unnecessary. 
} 

Perché belongsTo():

has_one e belongs_to in genere sono gli stessi in un senso che indicano l'altro modello relativo. belongs_to assicurarsi che questo modello abbia definito la chiave foreign_. has_one si assicura che l'altro modello abbia definito la chiave _principale.

vostro array $orders sarà simile a questo:

User => [ 
id => 'user id', 
name => 'user name' 
orders => [ 
    0 => [ 
     //order data 
     ] 
    1 => [ 
     //order data 
     ] 
     . 
     . 
     . 
     . 
    ] 
] 
1

In Modello di ordine è necessario utilizzare il rapporto belongsTo:

public function user() 
{ 
    return $this->belongsTo("App\User"); // second and third arguments are unnecessary. 
} 
+0

Restituisce 'Null' nuovamente, senza campi dalla tabella' Utente' – Dev

1

Nel modello User si possono usare rapporti hasMany, per esempio (in App/User.php):

public function orders() 
{ 
    return $this->hasMany("App\Order", "user_id", "id"); 
} 

Ora è possibile utilizzare questo:

return User::find(1)->orders; 
+0

Posso ottenere tutto in un risultato? – Dev