1
votes

Obtenir la propriété (aucun objet) laravel

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');
}


15 commentaires

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 boucle


J'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ît product (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 minuscules


Ouais 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 de recommande


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 @pcalkins


alors, 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Ψ


4 Réponses :


0
votes

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>


12 commentaires

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



0
votes

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'));
}


0 commentaires

0
votes

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 >


0 commentaires

0
votes

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


0 commentaires