可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I want to build a blade view from 3 tables:
- "inputs_details" - fields: article_type (values: 'p' for product,'s' for service), article_id, ....
- "products" - fields: id, name
- "services" - fields: id, name
But, in browser, I have the error: "Class 'Product' not found".
Is there a solution to pass to the view this function (to find the name of the product or the service based on article_type and article_id)?
I was trying also with join query, but I couldn't put so many conditions in a single join query .. where article_type is "p", then join with "products" table ... or .... where article_type is "s", then join with "services" table.
回答1:
Related to the question in your answer:
You have multiple options to achieve this that are way better:
Let's assume you have a model which you pass to the view:
$model = Model::find(1);
View::make('view')->withModel($model);
Now in your Model you could have a function:
public function someFunction() {
// do something
}
In your view you could call that function directly:
{{$model->someFunction()}}
This is nice if you want to do something with the model (the dataset).
If not you can still make a static function in the model:
public static function someStaticFunction($var1, $var2) {
// do something
}
And then:
{{App\Model::someStaticFunction($yourVar1,$yourVar2)}}
Hope it helps.
回答2:
I solve the problem. So simple. Syntax error.
But I also want to know how to pass a function with parameters to view....
回答3:
I ran into a similar issue where I wanted to call a function defined in my controller from my view. Although it perplexed me for a while trying to figure out how to get to the controller from the view it turned out to be fairly straightforward.
I hand off an array to my views with data records that the view formats and presents to the user with jQuery DataTables (big duh). One column in the presented UI table is a set of action buttons that need to be created per row based on the content of the data in each of the rows. I guess I could have added the button definitions to the data rows as a column sent to the views but not all views needed the buttons so why? Instead, I wanted the view that needed them add them.
In the controller I pass a reference to the controller itself to the view as in
->with('callbackController', $this)
I called it callbackController as that is what I was doing. Now, inside my view I can either escape to PHP to use $callbackController to access the parent controller as in
<?php echo $callbackController->makeButtons($parameters); ?>
or just use the Blade mechanism
{!! $callbackController->makeButtons($parameters); ?>
It seems to be working fine across multiple controllers and views. I have not noticed a performance penalty using this mechanism and I have one huge table with over 50K rows.
I have not tried to pass on references to other objects (e.g., models, etc) yet but I do not see what that would not work as well
Might not be elegant but it seems to get the job done.
回答4:
You can pass it to view but first query it in controller, and then after that add this :
return view('yourview', COMPACT('variabelnametobepassedtoview'));
回答5:
Instead of passing functions or querying it on the controller, I think what you need is relationships on models since these are related tables on your database.
If based on your structure, input_details and products are related you should put relationship definition on your models like this:
public class InputDetail(){
protected $table = "input_details";
....//other code
public function product(){
return $this->hasOne('App\Product');
}
}
then in your view you'll just have to say:
<p>{{ $input_details->product->name }}</p>
More simpler that way. It is also the best practice that controllers should only do business logic for the current resource. For more info on how to do this just go to the docs: https://laravel.com/docs/5.0/eloquent#relationships
回答6:
want to use model in view as:
{{ Product::find($id) }}
you can use in view:
<?php
$tmp = \App\Product::find($id);
?>
{{ $tmp->name }}
Hope this will help you