web-dev-qa-db-ja.com

Laravel 5ブレードビューでモデル関数を呼び出す

3つのテーブルからブレードビューを作成したい:

  • 「inputs_details」-フィールド:article_type(値:製品の場合は 'p'、サービスの場合は 's')、article_id、...
  • 「製品」-フィールド:id、name
  • 「サービス」-フィールド:id、name

enter image description here

しかし、ブラウザには「クラス '製品'が見つかりません」というエラーがあります。

この関数をビューに渡すソリューションはありますか(article_typeとarticle_idに基づいて製品またはサービスの名前を見つけるため)?

結合クエリも試していましたが、1つの結合クエリにそれほど多くの条件を入れることはできませんでした。 s」、「services」テーブルと結合します。

23
Mario Ene

あなたの答えの質問に関連する:

これを実現するための方法は複数あります。

ビューに渡すモデルがあると仮定します。

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

これで、モデルに次の機能を追加できます。

public function someFunction() {
    // do something
}

あなたのビューでは、その関数を直接呼び出すことができます:

{{$model->someFunction()}}

これは、モデル(データセット)で何かをしたい場合に便利です。

そうでない場合でも、モデルで静的関数を作成できます。

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

その後:

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

それが役に立てば幸い。

54
sleepless

私は問題を解決します。とても簡単。構文エラー。

  • アプリ\製品
  • アプリ\サービス

enter image description here

しかし、表示するパラメーターを持つ関数を渡す方法も知りたいです。

10
Mario Ene

ビューとしてモデルを使用したい:

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

ビューで使用できます:

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

これがあなたを助けることを願っています

4
Hưng Trịnh

同様の問題が発生し、コントローラーから定義された関数をビューから呼び出したいと思いました。ビューからコントローラーに到達する方法を見つけようとしてしばらく困惑しましたが、かなり簡単であることがわかりました。

ビューがフォーマットし、jQuery DataTables(大きな当たり)でユーザーに提示するデータレコードを使用して、配列をビューに渡します。表示されるUIテーブルの1つの列は、各行のデータの内容に基づいて行ごとに作成する必要があるアクションボタンのセットです。ビューに送信される列としてデータ行にボタン定義を追加できたと思いますが、すべてのビューにボタンが必要なわけではないので、なぜですか?代わりに、それらを追加する必要のあるビューが必要でした。

コントローラーでは、コントローラー自体への参照をビューに渡します

->with('callbackController', $this)

それが私がやっていたことなので、私はそれをcallbackControllerと呼びました。さて、私のビュー内でPHPにエスケープして$ callbackControllerを使用して親コントローラーにアクセスすることができます

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

または単にブレードメカニズムを使用します

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

複数のコントローラーとビューでうまく機能しているようです。このメカニズムを使用するとパフォーマンスが低下することはありませんが、行数が5万を超える巨大なテーブルが1つあります。

私はまだ他のオブジェクト(モデルなど)への参照を渡そうとしませんでしたが、それがうまく機能しないものがわかりません

エレガントではないかもしれませんが、仕事を成し遂げているようです。

2
Ken Christopher

コントローラで関数を渡したりクエリを実行したりする代わりに、モデル上の関係がデータベース上の関連テーブルであるため、必要なのはモデル上の関係だと思います。

構造に基づいて、input_detailsと製品が関連している場合は、次のようにモデルに関係定義を配置する必要があります。

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

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

あなたの意見では、あなたは言う必要があります:

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

その方がより簡単です。また、コントローラーは現在のリソースに対してのみビジネスロジックを実行することをお勧めします。これを行う方法の詳細については、次のドキュメントを参照してください。 https://laravel.com/docs/5.0/eloquent#relationships

1
Jed

あなたはそれをビューに渡すことができますが、最初にコントローラでそれをクエリし、その後これを追加します:

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

Laravelの新しいバージョンでは、「サービスインジェクション」を使用できます。

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