web-dev-qa-db-fra.com

Laravel 5 appeler une fonction de modèle dans une vue en lame

Je veux construire une vue de lame à partir de 3 tables:

  • "input_details" - champs: type_article (valeurs: 'p' pour le produit, 's' pour le service), article_id, ....
  • "produits" - champs: id, nom
  • "services" - champs: id, nom

enter image description here

Mais, dans le navigateur, j'ai l'erreur: "Classe 'Produit' non trouvé".

Existe-t-il une solution pour passer à la vue cette fonction (pour trouver le nom du produit ou du service basé sur article_type et article_id)?

J'essayais aussi avec une requête de jointure, mais je ne pouvais pas mettre autant de conditions dans une seule requête de jointure. Où article_type est "p", puis joindre avec la table "products" ... ou .... où article_type est " s ", puis joindre avec la table" services ".

23
Mario Ene

Relatif à la question dans votre réponse:

Vous avez plusieurs options pour y parvenir qui sont bien meilleures:

Supposons que vous ayez un modèle que vous transmettez à la vue:

$model = Model::find(1);
View::make('view')->withModel($model);

Maintenant, dans votre modèle, vous pourriez avoir une fonction:

public function someFunction() {
    // do something
}

À votre avis, vous pouvez appeler cette fonction directement:

{{$model->someFunction()}}

C'est bien si vous voulez faire quelque chose avec le modèle (le jeu de données).

Sinon, vous pouvez toujours créer une fonction statique dans le modèle:

public static function someStaticFunction($var1, $var2) {
    // do something
}

Et alors:

{{App\Model::someStaticFunction($yourVar1,$yourVar2)}}

J'espère que ça aide.

54
sleepless

Je résous le problème. Si simple. Erreur de syntaxe.

  • App\Produit
  • App\Service

enter image description here

Mais je veux aussi savoir comment passer une fonction avec des paramètres à afficher ....

10
Mario Ene

voulez utiliser le modèle en vue comme:

{{ Product::find($id) }}

vous pouvez utiliser en vue:

<?php
$tmp = \App\Product::find($id);
?>
{{ $tmp->name }}

J'espère que ceci vous aidera

4
Hưng Trịnh

J'ai rencontré un problème similaire dans lequel je voulais appeler une fonction définie dans mon contrôleur depuis mon point de vue. Bien que cela me rende perplexe pendant un moment en essayant de comprendre comment accéder au contrôleur, la vue s’avère assez simple.

Je cède un tableau à mes vues avec des enregistrements de données que la vue formate et présente à l'utilisateur avec jQuery DataTables (big duh). Une colonne de la table d'interface utilisateur présentée est un ensemble de boutons d'action qui doivent être créés par ligne en fonction du contenu des données de chacune des lignes. J'imagine que j'aurais pu ajouter les définitions de bouton aux lignes de données en tant que colonne envoyée aux vues, mais toutes les vues n'avaient pas besoin de boutons, alors pourquoi? Au lieu de cela, je voulais la vue qui avait besoin d'eux les ajouter.

Dans le contrôleur, je passe une référence au contrôleur lui-même à la vue comme dans

->with('callbackController', $this)

Je l'ai appelé callbackController car c'est ce que je faisais. Maintenant, dans ma vue, je peux soit échapper à PHP pour utiliser $ callbackController pour accéder au contrôleur parent comme dans

<?php echo $callbackController->makeButtons($parameters); ?>

ou utilisez simplement le mécanisme de la lame

{!! $callbackController->makeButtons($parameters); ?>

Il semble fonctionner correctement sur plusieurs contrôleurs et vues. Je n'ai pas remarqué de pénalité de performances avec ce mécanisme et j'ai une table énorme avec plus de 50 000 lignes.

Je n'ai pas encore essayé de transmettre des références à d'autres objets (modèles, etc.), mais je ne vois pas ce qui ne fonctionnerait pas aussi bien.

Peut-être pas élégant mais il semble faire le travail.

2
Ken Christopher

Au lieu de transmettre des fonctions ou de les interroger sur le contrôleur, je pense que ce dont vous avez besoin, ce sont des relations sur les modèles car il s'agit de tables liées dans votre base de données.

Si, en fonction de votre structure, input_details et des produits sont liés, vous devez définir la relation dans vos modèles de la manière suivante:

public class InputDetail(){
 protected $table = "input_details";
 ....//other code

 public function product(){
   return $this->hasOne('App\Product');
 }
}

alors, à votre avis, il vous suffira de dire:

<p>{{ $input_details->product->name }}</p>

Plus simple de cette façon. Il est également recommandé que les contrôleurs ne gèrent la logique métier que pour la ressource actuelle. Pour plus d'informations sur la procédure à suivre, consultez la documentation: https://laravel.com/docs/5.0/eloquent#relationships

1
Jed

Vous pouvez le transmettre à la vue, mais interrogez-le d'abord dans le contrôleur, puis ajoutez ensuite ceci:

return view('yourview', COMPACT('variabelnametobepassedtoview'));
0
Rikudo Pain

Dans la nouvelle version de Laravel, vous pouvez utiliser "Service Injection".

https://laravel.com/docs/5.8/blade#service-injection

/resources/views/main.blade.php

@inject('project', 'App\Project')

<h1>{{ $project->get_title() }}</h1>
0
Mowshon