2017-10-06 4 views
2

J'ai la structure de la table users suivante:relation Laravel avec un à un

id 
email 
.... 
status // foreign key from tbl_status 

Maintenant, dans mon tbl_status:

id 
name 
description 

Maintenant, je voudrais créer une relation telle que si je avoir un statut de 1 dans le tableau users Je voudrais obtenir son nom. J'ai essayé:

Dans mon modèle User:

class User extends Model 
{ 
    protected $fillable = [ 
     'name', 'email', 'password', 'status' 
    ]; 

    public function userstatus() 
    { 
     return $this->hasOne('App\Status', 'id', 'status'); 
    } 
} 

Dans le modèle Status:

class Status extends Model 
{ 
    protected $fillable = [ 
     'name', 'description' 
    ]; 
} 

Lors de l'extraction des enregistrements via ...

return User::with("userstatus")->paginate(10); 

... il renvoie toujours le statut null même si chaque utilisateur a un défaut l'état d'erreur 1 et la table d'état a un ID de 1 avec une valeur.

+0

Ajouter une colonne user_id à table tbl_status avec l'étranger contrainte de clé référençant les utilisateurs id colonne – Mena

+0

Merci ive mis à jour et maintenant cela fonctionne. Est-il possible d'obtenir seulement le nom seul puisque ot retourne un tableau entier de données d'état qui obtient seulement le nom –

+0

la raison de la table d'état est d'avoir des données cohérentes. Par exemple, lors de la création d'un utilisateur ayant une clé étrangère de 0 et affichant simplement le nom dans le frontend signifie que celui qui crée un utilisateur enregistre un ID 0 signifiant actif et plus tard quand le client peut vouloir changer le nom actif en utilisateur actif, il mettre à jour la table d'état. –

Répondre

3

Cette relation est à l'envers. Placer la status clé étrangère sur la table users crée les relations suivantes:

  • User appartient à Status
  • Status a beaucoup de User s

Cependant, la question montre une relation hasOne() sur le modèle User pour userstatuses(). Pour que cela fonctionne, tbl_status aura besoin d'un champ user_id, mais cela signifie qu'un Statusne peut appartenir qu'à unUser.

Au lieu de cela, la relation correcte pour userstatus() sur User devrait être belongsTo():

public function userstatus() 
{ 
    return $this->belongsTo(App\Status::class, 'status'); 
} 

Ensuite, nous pouvons utiliser les relations appropriées sur le modèle User:

$user = User::with('userstatus')->find(1); 
$user->status;     // 1 (foreign key ID) 
$user->userstatus->name;  // "status name" 
$user->userstatus->description // "This is the status description." 
+0

Ceci est une bonne réponse. Vous pouvez également gérer la sélection de certains champs dans la relation. –

+0

doesnt belongsTo signifie qu'un utilisateur peut avoir plusieurs statuts mais hasOne Signifie que l'utilisateur n'a qu'un statut? –

+2

Non. L'utilisateur a une clé étrangère qui référence l'identifiant sur l'état. Un utilisateur peut se voir attribuer un statut à la fois mais un statut peut être attribué à différents utilisateurs. –

2

Je pense que la meilleure façon de le faire sera d'ajouter une colonne user_id qui fait référence à la colonne id de l'utilisateur en tant que clé étrangère au lieu de l'état. Cela devrait le réparer.

+0

il corrige sûrement le problème, mais est-il possible d'obtenir une seule variable de la table d'état, par exemple: obtenir seul nom sans les autres variables –

+0

Oui, vous pouvez obtenir le nom seul. À votre avis, essayez quelque chose comme user-> userstatus-> name – Mena

+0

Marqué la réponse aussi. suis retournant json données cela signifie-t-il que malade a maintenant encore à faire foreach déclaration pour le décomposer –