web-dev-qa-db-fra.com

Laravel appartientPour ne pas travailler

J'ai 2 modèles dans mon application, "Utilisateur" et "Type de médecine" (chaque utilisateur appartient à un type de médecine).

J'ai établi la relation un-à-plusieurs entre deux modèles à l'aide de rasé () et hasMany (). La relation hasMany () fonctionne parfaitement, mais Appartient à () ne fonctionne pas. Est-ce que quelqu'un sait où j'ai fait une erreur?

User :: find (1) -> medicine_type [ceci ne retourne rien]

MedicineType :: find (1) -> utilisateurs [renvoie utilisateurs]

Voici le code pour les modèles:

class MedicineType extends Eloquent {

    public function users()
    {
        return $this->hasMany('User');
    }
}


class User extends Eloquent {

    public function medicine_type()
    {
        return $this->belongsTo('MedicineType');
    }
}

Et voici ma structure de base de données:

users:
    id
    name
    medicine_type_id 

medicine_types:
    id
    name
23
Yashari

La raison pour laquelle votre relation ne fonctionne pas n'est pas due aux relations spécifiées dans le modèle, mais à la désignation de la méthode dans le modèle User et à la non spécification de la clé étrangère.

Au lieu de:

public function medicine_type()
{
    return $this->belongsTo('MedicineType');
}

Utilisation:

public function medicineType()
{
    return $this->belongsTo('MedicineType', 'id');
}

J'espère que cela fonctionne pour vous;)

Tout ensemble:

<?php // app/models/MedicineType.php

class MedicineType extends Eloquent {

   // Determines which database table to use
   protected $table = 'medicine_types';

   public function users() 
   {
      return $this->hasMany('User');
   }

}

et: 

<?php // app/models/User.php

class User extends Eloquent {

   // Determines which database table to use
   protected $table = 'users';

   public function medicineType() 
   {
      return $this->belongsTo('MedicineType', 'id');
   }

}

Tester si cela fonctionne:

$user = User::find(1);
return $user->medicineType->name;

Cela renvoie avec succès le nom du médicament_type associé.

J'espère que cela vous aide plus loin;)

40
Melvin Koopmans

Peut-être qu'il y a un problème avec Eloquent pour trouver la clé étrangère. Essaye ça:

class User extends Eloquent {

    public function medicine_type()
    {
        return $this->belongsTo('MedicineType', 'medicine_type_id');
    }
}

MODIFIER:

De plus, Eloquent essaie de trouver la table "medicinetypes" et non "medecine_types", vous devez donc le spécifier également à l'aide de la variable $table.

class MedicineType extends Eloquent {
    protected $table = 'medicine_types';

    public function users()
    {
        return $this->hasMany('User');
    }
}
9
Joseph

Je change "medicine_type" en "medicineType" et tout va bien ...

1
Yashari

La réponse numéro un voté pourrait être la meilleure réponse dans la plupart des cas. Toutefois, si vous rencontrez toujours des difficultés pour charger la relation associée et que vous n’avez pas de chance.

Il y a une autre chose qui peut fonctionner. Examinez chacune des tables du modèle et leurs index ou clés étrangères. Dans mon cas, j'avais changé le nom de la table mais je n'ai jamais mis à jour l'index impliqué et les clés étrangères.

Solution. 

A: (Feeling Lazy) Supprimez simplement l'index ou la clé étrangère associé.

B: (Je ne suis pas paresseux) Déposer la table par migration laravel et réexécuter migrateur avec les clés étrangères appropriées.

0
Jonnathan moreno

Dans mon cas, les données des modèles associés ont été supprimées et Laravel n’obtient pas de données supprimées logiquement dans une requête générale. Pour obtenir des données supprimées par logiciel, utilisez "withTrashed () ou onlyTrashed ()".

Vous pouvez consulter la documentation ici.

https://laravel.com/docs/5.6/scout#soft-deleting

0
sh6210