Je souhaite définir une relation entre les tables et je ne sais pas où je me trompe.
Voici mes tables:
utilisateurs p>
$result = $restaurant->where('id',2)->menus()->get();
restaurants
public function restaurants(){ return $this->belongsTo(Restaurant::class); }
menus
public function menus(){ return $this->hasMany(Menu::class); }
menu_restaurant
public function restaurant(){ return $this->hasOne(Restaurant::class); }
Dans le tableau users
, le champ level
sera défini par moi avec deux mots: [user]
ou [restaurant
.
Modèle d'utilisateur
-restaurant_id -menu_id -price
Modèle de restaurant
-id -name
Modèle de menu p>
-id -name -user_id
J'attends la sortie de ce code:
-id -email -level
Pour être des enregistrements et des relations, mais j'obtiens l'erreur suivante.
BadMethodCallException Appel à la méthode non définie Illuminate \ Database \ Eloquent \ Builder :: menus ()
Que dois-je faire?
4 Réponses :
En fait,
vous avez défini les relations de manière correcte. Je pense que vous avez un problème sur le point d'obtenir ces relations sur les questions éloquentes. Si vous souhaitez obtenir la relation de menu d'un restaurant spécifique; vous devez implémenter quelque chose comme ça.
$restaurant = Restaurants::find(2); $restaurant->menus(); // this will return an array of related menus.
Vous devriez lire Documentation officielle Laravel . Il existe des titres Récupération de la relation pour chaque définition de relation.
J'ai écrit ce code avec echo et return et j'obtiens cette erreur: L'objet de la classe Illuminate \ Database \ Eloquent \ Builder n'a pas pu être converti en chaîne
, mais sans retour et écho je n'ai pas eu d'erreur mais il ne me montre rien.
@MahdiAlikhani c'est juste une erreur PHP générique très simple qui n'a rien à voir avec Laravel. Comme l'erreur indique que vous ne pouvez pas convertir un objet en chaîne, si vous voulez simplement voir le contenu de l'objet, var_dump () est ce dont vous avez besoin ou mieux encore la fonction laravels dd () pour que vous ayez également le formatage
Comme @twigg l'a mentionné, il s'agit d'une erreur PHP générique. Vous devez exécuter avec la boucle for dessus. Ou vous pouvez obtenir un vidage via la fonction dd de Laravel. dd ($ restaurant-> menus ());
Les relations que vous définissez ne sont pas disponibles pour vous dans la portée query de votre instance de générateur comme vous avez essayé de les appeler. Ils sont disponibles dans le cadre de vos modèles . L'inclusion de vos relations dans les requêtes se fait différemment - vous devriez consulter la documentation officielle sur le sujet d'abord .
Dans votre cas, si vous souhaitez sélectionner tous les menus appartenant à un restaurant spécifique, vous devez procéder comme suit:
Vous pouvez d'abord aller chercher un restaurant spécifique, puis obtenir ses menus via une relation:
$menus = Menu::whereHas('restaurants', function ($query) { $query->where('id', 2); })-get();
Vous pouvez rechercher des menus via le modèle Menu
:
$restaurant = Restaurant::find(2); $menus = $restaurant->menus;
Vos relations sont également mal configurées. En fonction de la structure des tables que vous avez indiquée, vos menus et vos restaurants sont en relation plusieurs-à-plusieurs . Par conséquent, la méthode de relation restaurants ()
dans la classe Menu
doit renvoyer l'instance BelongsToMany
. Alors pendant que vous y êtes, je vous suggère fortement de consulter la documentation relative aux relations et regardez des exemples jusqu'à ce que vous compreniez le fonctionnement des différentes relations dans Laravel.
vous savez, dans ce scénario, j'ai un tableau menus dans lequel je garde des menus, et restaurant_menu pour un tableau croisé dynamique pour y conserver les menus et les prix de chaque restaurant, je Je suis confus et je ne sais pas quoi faire!
Il y a un problème avec votre relation. Vous avez une relation un à plusieurs entre le modèle de restaurant et le modèle de menu. Cependant, votre structure de tableau suggère qu'ils ont un modèle plusieurs à plusieurs.
Si vous pensez que votre modèle est correct, changez le tableau des menus de la manière suivante,
menus
-id -name -restaurant_id //new field
Supprimez également la table "restaurant_menu".
Si vous pensez que votre base de données est correcte, essayez de changer le modèle en conséquence.
vous savez, dans ce scénario, j'ai un tableau de menus dans lequel je garde des menus, et restaurant_menu pour le tableau croisé dynamique pour garder les menus et les prix de chaque restaurant, je suis confus et je ne sais pas quoi faire!
Un restaurant peut avoir plus d'un menu. Mais l'inverse est-il vrai? Un menu peut-il s'appliquer à plus d'un restaurant? Si oui, vous avez besoin d'un tableau croisé dynamique. Sinon, vous ne devez utiliser «restaurant_id» que dans le tableau des menus.
IN modèle utilisateur
public function menues(){ return $this>hasManyThrough(Menu::class,restaurant_menu::class,'menu_id','id','id','restaurant_id'); }
Modèle de restaurant
$result = Restaurant::with('menus')->where('id',2)->get();
Modèle de menu
public function restaurants(){ return $this->belongsTo(Restaurant::class); }
Au fur et à mesure que vous aspectez votre sortie, vous devez écrire
public function menus(){ return $this->hasMany(Menu::class,'id','menu_id'); }
vous obtiendrez des données relationnelles. Comme quels restaurants ont quels menus.
Vous pouvez également l'utiliser pour votre scénario. Utilisez ceci dans votre modèle de restaurant
public function restaurant(){ return $this->hasMany(Restaurant::class,'user_id','id'); }
J'ai fait tout cela, mais je dois créer le champ restaurant_id dans le tableau des menus, je pense que cela ne m'aidera pas, vous savez, dans ce scénario, j'ai des menus table que je garde les menus dedans, et restaurant_menu pour le tableau croisé dynamique pour garder les menus et les prix de chaque restaurant, je suis confus et je ne sais pas quoi faire!
si vous voulez faire comme ce que vous dites, alors vous devez utiliser la relation "hasManyThrough" dans votre modèle. au fur et à mesure que j'édite ma réponse. Vous trouverez la nouvelle suggestion dans la dernière fonction
merci pour votre réponse, j'ai utilisé votre code et en changer une partie et enfin obtenir le résultat! J'ai une autre question, comment puis-je stocker les données de $ request dans la table Restaurant_Menu ? J'ai un panneau pour les restaurateurs qui créeront leurs propres menus à partir de la liste et fixeront les prix, toutes ces informations doivent être stockées dans le tableau * Restaurant_Menu .
Cela dépend totalement de vous. Comment vous maintenez votre conception de fin de police. Vous pouvez facilement utiliser des sélecteurs déroulants qui permettent à un utilisateur de sélectionner restaurant_id et menu_id dans un champ de texte pour définir les prix. Vous pouvez également sélectionner votre restaurant, puis simplement identifier le menu et définir le prix. Mais rappelez-vous une chose si vous utilisez la deuxième idée, vous devez passer l'identifiant du restaurant dans un fichier caché. J'espère que tu as compris
Oh tu as raison. Je pense que le premier est meilleur que le second.
Merci encore de m'avoir aidé.
en abrégé, vous pouvez utiliser
$ restaurant = Restaurants :: find (2) -> menus;
Toujours le même..
@MahdiAlikhani c'est parce que vos relations sont mal configurées. Vous devez utiliser la relation
makesToMany
pour votre relation restaurant-menu comme je l'ai indiqué dans ma réponse. Si vous avez du mal à créer une structure de table adaptée à votre problème, créez une question distincte avec la balisedatabase-design
.