Laravel 5 在 blade 视图中调用模型函数
Laravel 5 call a model function in a blade view
我想从 3 table 秒开始构建一个 blade 视图:
- "inputs_details" - 字段:article_type(值:'p' 代表产品,'s' 代表服务),article_id,....
- "products" - 字段:id, name
- "services" - 字段:id, name
但是,在浏览器中,我有错误:"Class 'Product' not found"。
有没有办法把这个函数传递给视图(根据article_type和article_id查找产品或服务的名称)?
我也尝试过连接查询,但我不能在单个连接查询中放置这么多条件.. 其中 article_type 是 "p",然后使用 "products" 连接table ... 或 .... 其中 article_type 是 "s",然后加入 "services" table.
我解决了问题。很简单。语法错误。
- App\Product
- App\Service
不过我也想知道怎么传一个带参数的函数来查看....
与您回答的问题相关:
您有多个选项可以更好地实现此目的:
假设您有一个传递给视图的模型:
$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)}}
希望对您有所帮助。
您可以将它传递给视图,但首先在控制器中查询它,然后再添加:
return view('yourview', COMPACT('variabelnametobepassedtoview'));
我认为您需要的是模型上的关系,而不是在控制器上传递函数或查询它,因为这些是数据库中的相关表。
如果根据您的结构,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
我 运行 遇到了一个类似的问题,我想从我的视图中调用我的控制器中定义的函数。虽然让我困惑了一段时间,试图找出如何从视图到达控制器,但事实证明它相当简单。
我将一个数组交给我的视图,其中包含视图格式化的数据记录,并使用 jQuery 数据表(big duh)呈现给用户。显示的 UI table 中的一列是一组操作按钮,需要根据每行中的数据内容为每行创建这些按钮。我想我可以将按钮定义添加到数据行中作为发送到视图的列,但并非所有视图都需要按钮,为什么?相反,我想要需要他们添加它们的视图。
在控制器中,我将对控制器本身的引用传递给视图,如
->with('callbackController', $this)
我将其称为 callbackController,因为我当时就是这样做的。现在,在我看来,我可以转义到 PHP 以使用 $callbackController 访问父控制器,如
<?php echo $callbackController->makeButtons($parameters); ?>
或者只使用 Blade 机制
{!! $callbackController->makeButtons($parameters); ?>
似乎跨多个控制器和视图工作正常。我没有注意到使用这种机制的性能损失,我有一个超过 50K 行的巨大 table。
我还没有尝试传递对其他对象(例如模型等)的引用,但我看不出有什么不可行的
可能不够优雅,但似乎可以完成工作。
想在以下视图中使用模型:
{{ Product::find($id) }}
您可以在视图中使用:
<?php
$tmp = \App\Product::find($id);
?>
{{ $tmp->name }}
希望对您有所帮助
在 Laravel 的新版本中,您可以使用 "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>
我想从 3 table 秒开始构建一个 blade 视图:
- "inputs_details" - 字段:article_type(值:'p' 代表产品,'s' 代表服务),article_id,....
- "products" - 字段:id, name
- "services" - 字段:id, name
但是,在浏览器中,我有错误:"Class 'Product' not found"。
有没有办法把这个函数传递给视图(根据article_type和article_id查找产品或服务的名称)?
我也尝试过连接查询,但我不能在单个连接查询中放置这么多条件.. 其中 article_type 是 "p",然后使用 "products" 连接table ... 或 .... 其中 article_type 是 "s",然后加入 "services" table.
我解决了问题。很简单。语法错误。
- App\Product
- App\Service
不过我也想知道怎么传一个带参数的函数来查看....
与您回答的问题相关:
您有多个选项可以更好地实现此目的:
假设您有一个传递给视图的模型:
$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)}}
希望对您有所帮助。
您可以将它传递给视图,但首先在控制器中查询它,然后再添加:
return view('yourview', COMPACT('variabelnametobepassedtoview'));
我认为您需要的是模型上的关系,而不是在控制器上传递函数或查询它,因为这些是数据库中的相关表。
如果根据您的结构,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
我 运行 遇到了一个类似的问题,我想从我的视图中调用我的控制器中定义的函数。虽然让我困惑了一段时间,试图找出如何从视图到达控制器,但事实证明它相当简单。
我将一个数组交给我的视图,其中包含视图格式化的数据记录,并使用 jQuery 数据表(big duh)呈现给用户。显示的 UI table 中的一列是一组操作按钮,需要根据每行中的数据内容为每行创建这些按钮。我想我可以将按钮定义添加到数据行中作为发送到视图的列,但并非所有视图都需要按钮,为什么?相反,我想要需要他们添加它们的视图。
在控制器中,我将对控制器本身的引用传递给视图,如
->with('callbackController', $this)
我将其称为 callbackController,因为我当时就是这样做的。现在,在我看来,我可以转义到 PHP 以使用 $callbackController 访问父控制器,如
<?php echo $callbackController->makeButtons($parameters); ?>
或者只使用 Blade 机制
{!! $callbackController->makeButtons($parameters); ?>
似乎跨多个控制器和视图工作正常。我没有注意到使用这种机制的性能损失,我有一个超过 50K 行的巨大 table。
我还没有尝试传递对其他对象(例如模型等)的引用,但我看不出有什么不可行的
可能不够优雅,但似乎可以完成工作。
想在以下视图中使用模型:
{{ Product::find($id) }}
您可以在视图中使用:
<?php
$tmp = \App\Product::find($id);
?>
{{ $tmp->name }}
希望对您有所帮助
在 Laravel 的新版本中,您可以使用 "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>