Laravel 5在刀片视图中调用模型函数

时间:2015-03-12 10:46:09

标签: blade laravel-5

我想从3个表构建一个刀片视图:

  • “inputs_details” - 字段:article_type(值:产品'p',服务's'),article_id,....
  • “products” - 字段:id,name
  • “services” - 字段:id,name

enter image description here

但是,在浏览器中,我有错误:“未找到”类'产品'。

是否有传递给视图此功能的解决方案(根据article_type和article_id查找产品或服务的名称)?

我也尝试使用连接查询,但是我无法在单个连接查询中添加这么多条件..其中article_type是“p”,然后加入“products”表...或者...... article_type是“s”,然后加入“services”表。

7 个答案:

答案 0 :(得分:49)

与答案中的问题相关:

您可以通过多种方式实现这一目标:

假设您有一个传递给视图的模型:

$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)}}

希望它有所帮助。

答案 1 :(得分:10)

我解决了这个问题。很简单。语法错误。

  • 应用\产品
  • 应用\服务

enter image description here

但我也想知道如何传递带参数的函数来查看......

答案 2 :(得分:3)

想在视图中使用模型:

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

您可以在视图中使用

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

希望这对您有帮助

答案 3 :(得分:3)

在新版本的Laravel中,您可以使用“服务注入”。

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

/resources/views/main.blade.php

{% extends "blog/index.html" %}
{% block content %}
    <h1>Questionnaire page</h1>
    <form method="post">
        {% csrf_token %}
        {% for object in form_quest %}
        {% if object.questionnaire %}
        <h2> {{ object.activity }} </h2>
        {{ object.questionnaire.as_ul}}
        {% endif %}
        {% endfor %}
        <button type="submit">Submit</button>
    </form>
    <p> {{ context }} </p>
{% endblock content %}

答案 4 :(得分:2)

我遇到了类似的问题,我希望从我的视图中调用我的控制器中定义的函数。虽然让我困惑了一段时间试图弄清楚如何从视图中找到控制器但结果却相当简单。

我使用数据记录将数组传递给我的视图,视图格式化并使用jQuery DataTables(big duh)呈现给用户。所呈现的UI表中的一列是一组动作按钮,需要基于每行中的数据内容每行创建。我想我可以将按钮定义添加到数据行作为发送到视图的列,但不是所有视图都需要按钮,为什么呢?相反,我想要他们需要的视图添加它们。

在控制器中,我将对控制器本身的引用传递给视图,如

->with('callbackController', $this)

我称之为callbackController,因为我正在做的事情。现在,在我的视图中,我可以转义到PHP,使用$ callbackController访问父控制器,如

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

或只使用Blade机制

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

它似乎在多个控制器和视图中正常工作。我没有注意到使用这种机制的性能损失,我有一个超过50K行的巨大表。

我还没有尝试传递对其他对象(例如模型等)的引用,但是我没有看到那些不起作用的内容

可能不优雅,但似乎完成了工作。

答案 5 :(得分:0)

您可以将其传递给视图,但首先在控制器中查询,然后添加:

return view('yourview', COMPACT('variabelnametobepassedtoview'));

答案 6 :(得分:0)

我认为您需要的是模型上的关系,而不是传递函数或在控制器上查询它,因为它们是数据库中的相关表。

如果根据您的结构,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