2017-09-25 5 views
1

J'ai un modèle User avec des attributs comme identifiant, identifiant, âge, etc. Une autre table est user_data avec une colonne residence, par exemple.Comment puis-je récupérer des modèles Laravel en faisant correspondre une valeur à une relation?

Comment puis-je obtenir tous les utilisateurs avec une résidence spécifique? J'ai ceci:

modèle User:

public function user_data() 
{ 
    return $this->hasMany('App\Models\UserData'); 
} 

public function FilterUser($request) 
{ 
    if ($request->has('city')) 
    { 
     $users = User::with('user_data')->where('residence', 'Warsaw')->get();   
    } 

    dd($users); 
} 

modèle UserData:

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

Maintenant, j'obtiens cette erreur:

Column not found: 1054 Unknown column 'residence' in 'where clause' (SQL: select * from `users` where `residence` = warsaw and `users`.`deleted_at` is null)

Et une autre question:

Si User est mon modèle principal, devrais-je le connecter avec des relations comme ci-dessus? hasMany() ou belongsTo()?

+0

Faire une sql sQuery pour l'obtenir: https://laravel.com/docs/5.5/queries – Peter

+0

@peter que vous voyez ci-dessus, je l'ai essayé beaucoup de fois, mais ça ne marche pas ork – browinski

Répondre

1

Utilisez la méthode constructeur de requête whereHas():

$users = User::with('user_data') 
    ->whereHas('user_data', function($query) { 
     $query->where('residence', 'Warsaw'); 
    }) 
    ->get(); 

Edition - Pour utiliser la valeur de $request vous devez importer la variable à la fermeture pour whereHas():

... 
    ->whereHas('user_data', function($query) use ($request) { 
     $query->where('residence', $request->city); 
    }) 
    ... 

Edition - Un query scope peut être une meilleure approche. Dans le modèle User, ajoutez cette méthode:

function scopeInCity($query, $city) 
{ 
    return $query->whereHas('user_data', function($q) use ($city) { 
     $q->where('residence', $city); 
    }); 
} 

Vous pouvez ensuite filtrer tous les utilisateurs en ville (en dehors du modèle):

User::inCity($request->city)->get(); 
+0

Cela fonctionne. Mais comment changer Varsovie en $ request-> city? J'ai $ request comme paramètre de fonction put id ne fonctionne pas maintenant – browinski

+0

Mis à jour pour montrer cet exemple! –

+0

Et la dernière question. Je ne peux pas faire quelque chose comme $ user-> id parce que: La propriété [id] n'existe pas sur cette instance de collection Comment le faire correctement? – browinski

0

Utilisez whereHas si vous voulez obtenir tous les utilisateurs qui ont une relation avec un attribut spécifique comme ceci:

$users = User::whereHas('user_data', function($q) { 
$q->where('residence', 'Warsaw');})->get();