J'ai un tableau des recommandations contenant les colonnes user_id
et product_id
et j'essaie d'afficher la plupart des produits consultés mais j'obtiens une erreur
Essayer d'obtenir la propriété d'un non-objet à partir de la vue,
si je jj ($ visualisé)
cela montre tous les produits correctement mais le problème est qu'il ne peut pas afficher les produits et jette une erreur, une idée sur la façon de résoudre cela?
Controller
public function product() { return $this->belongsTo('App\Product','product_id'); }
Blade
fichier
public function recommends() { return $this->hasMany('App\Recommends','product_id'); }
4 Réponses :
Vous obtenez une collection d'objets Recommends qui incluent le modèle Produit . L'erreur provient probablement d'un produit
manquant dans la variable $ view
. Peut-être en raison de la déclaration GroupBy
ou vous pouvez tout simplement ne pas avoir de produit associé à ce modèle View.
Essayez ceci sur votre page lame pour tester:
<h1>USD: {{isset($view->product_id)?$view->product->price: 'No Product Set'}}</h1> <h2>USD: {{isset($view->product_id)?$view->product->info: 'No Product Set'}}</h2>
J'obtiens toujours Essayer d'obtenir la propriété d'un non-objet
@Watercayman
OK, retirez -> groupBy ('product_id') -> orderby ('product_id', 'DESC')
et réessayez s'il vous plaît? Ceci définit ces champs sur la collection plutôt que sur chaque modèle vue
.
J'ai essayé de les éliminer mais ne fonctionne toujours pas @Watercayman
OK, dernière chose à vérifier: retirez également le -> select ('product_id')
de la requête (également le groupby et orderby). Parfois, ne pas avoir le modèle complet peut modifier la requête pour la relation. Veuillez essayer ceci comme diagnostic. Oh, et le -> inRandomOrder ()
. Simplifiez la vérification des bogues
Si la version la plus simple de la requête ne fonctionne pas, je suis un peu à court de réponses. Vous avez tout compris. Peut-être quelque chose d'autre au-dessus des lignes
. Attendez - comment pouvez-vous obtenir une erreur non-objet après avoir vérifié isset dans la lame? Êtes-vous sûr que l'erreur se trouve sur la variable
$ view
?
Je ne sais pas si l'erreur est dans la vue ou dans le contrôleur car si je dd ($ views) je vois les produits et tout @Watercayman
Si vous @dd ($ vu) sur la page blade , obtenez-vous la même chose? Collection correcte, y compris les produits? La variable que vous envoyez est-elle $ views
ou $ views
? Envoyez-vous la bonne variable?
Eh bien, il y a le problème. Vous envoyez la mauvaise variable - envoyez-vous $ views
ou $ views
d'un contrôleur à l'autre?
Veuillez publier votre créateur de vue dans votre contrôleur - si $ visualisé
s'affiche correctement dans le contrôleur et que la vue est nulle, le problème est soit le traitement / nom de la variable, soit la manière dont il est envoyé. Veuillez afficher la partie `` vue de retour (... etc) '' de votre contrôleur
Je renvoie deux variables dans la même vue comme cette return view ('front.home', compact ('viewed', 'recommend'));
. Même si je retourne comme ceci return view ('front.home', compact ('viewed'));
il affiche toujours null dans la vue @Watercayman
Eh bien, je suis perplexe. Ce code semble correct. Si visualisé
se vide bien du contrôleur et null de la lame après ce qui ressemble à une déclaration de retour correcte, je ne sais pas quoi vous dire, je suis désolé.
Pensez-vous que cela pourrait être une cache ou quelque chose comme ça? @Watercayman
où vous transmettez $ view et où votre fichier de vue de chargement dans la fonction interne de votre contrôleur, essayez ceci:
//controller function abc(){ $viewed = Recommends::with('product') ->where('user_id', Auth::user()->id) ->select('product_id') ->inRandomOrder() ->groupBy('product_id') ->orderby('product_id', 'DESC') ->take(8) ->get(); return view('folder/blade_file_name', compact('viewed')); }
Comment avez-vous associé la variable $ viewed à la vue? Je pense qu'il vaut mieux savoir comment déboguer ceci donc je vais essayer de vous aider de cette façon.
Vérifiez si chaque variable $ view a $ product dans le contrôleur. quelque chose comme ça
foreach($viewed as $view) { if (!$view->product) { dd($view); } }
si toute la collection $ vue a un produit, le problème n'est pas dans les données afin que nous puissions passer à d'autres parties.
p >
Avoir une relation données / variable est vide, alors cela créera une erreur comme la même chose, donc vous mettrez une condition comme ici .........
Fichier lame
@if(!empty($viewed)) @foreach($viewed as $view) <h1>USD: {{$view->product ? $view->product->price : ''}}</h1> <h2>USD: {{$view->product ? $view->product->info : ''}}</h2> @endforeach @endif
Pouvez-vous publier les données renvoyées lorsque vous faites
dd ()
Peut-être que toutes les vues n'ont pas de produits? Si tel est le cas, vous devez vérifier si le produit existe avant de pouvoir obtenir la propriété.
J'ai édité la question @codervine
Pouvez-vous montrer votre modèle View? Il semble que products () puisse être
hasMany
, auquel cas vous devez soit obtenir le premier produit, soit ajouter une autre boucleJ'ai ajouté les modèles @aynber
Pourriez-vous modifier la question et coller le message d'erreur complet que vous obtenez?
Il est étrange que le modèle associé s'appelle
Product
(en majuscules) mais dans le jj la relation apparaîtproduct
(en minuscules). Je l'ai essayé pour les doutes et dans les relations le nom de la classe m'apparaît tel quel, pas en minusculesOuais parce qu'il prend ce
produit de fonction publique ()
c'est en minuscule @ porloscerrosΨJe veux dire le nom de la classe, pas le nom de la relation ... pas celui-ci ->
"product" => produit
<- celui-ci devrait être Product, (je pense)Pensez-vous que cela pourrait être le problème? @ porloscerrosΨ
Je ne sais pas, c'est juste une observation de quelque chose qui me semble étrange, car quand je fais un dd, ça me montre le nom de la classe à cet endroit. Si vous regardez Recommends, vous verrez qu'il s'agit de
Recommends
et non derecommande
essayez avec $ view-> product ['price'] ... etc.
Je ne peux même pas voir le produit en vue si jj ($ vu) le produit est nul
product "=> null
mais dans le contrôleur c'est bien mais je ne peux pas passer à la vue @pcalkinsalors, montrez-nous comment vous retournez la vue avec la variable, je veux dire le retour de votre méthode de contrôleur
Je retourne la vue comme ceci
return view ('front.home', compact ('viewed', 'recommend'));
@ porloscerrosΨ