Laravel 5 вызовите функцию модели в виде лезвия

Я хочу создать вид блейда из трех таблиц:

  • "input_details" - fields: article_type (значения: 'p' для продукта, 's' для службы), article_id,....
  • "products" - fields: id, name
  • "services" - поля: id, name

enter image description here

Но в браузере у меня есть ошибка: "Класс" Продукт "не найден".

Есть ли решение перейти к представлению этой функции (найти имя продукта или услуги на основе article_type и article_id)?

Я также пытался выполнить запрос на соединение, но не смог установить столько условий в одном запросе соединения. где article_type - "p", затем присоединяется к таблице "products"... или... где article_type "s", затем присоединяется к таблице "services".

Ответы

Ответ 1

Относительно вопроса в вашем ответе:

У вас есть несколько вариантов для достижения наилучших результатов:

Предположим, что у вас есть модель, которую вы передаете в представление:

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

Надеюсь, что это поможет.

Ответ 2

Я решаю проблему. Так просто. Ошибка синтаксиса.

  • App\продукт
  • App\Service

enter image description here

Но я также хочу знать, как передать функцию с параметрами для просмотра....

Ответ 3

хочу использовать модель в виде:

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

Вы можете использовать в виду:

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

Надеюсь, что это поможет вам

Ответ 4

У меня возникла аналогичная проблема, когда я хотел вызвать функцию, определенную в моем контроллере, из моего представления. Хотя он некоторое время озадачивал меня, пытаясь понять, как добраться до контроллера с точки зрения, оказалось, что он довольно прост.

Я передаю массив своим представлениям с записями данных, которые форматы представления и представляют пользователю с помощью jQuery DataTables (большое значение). Один столбец в представленной таблице пользовательского интерфейса представляет собой набор кнопок действий, которые необходимо создать для каждой строки на основе содержимого данных в каждой из строк. Наверное, я мог бы добавить определения кнопок в строки данных, как столбцы, отправленные в представления, но не все представления нуждались в кнопках, так почему? Вместо этого я хотел, чтобы представление, в котором они нуждались, добавляло их.

В контроллере я передаю ссылку на сам контроллер на представление, как в

->with('callbackController', $this)

Я назвал его callbackController, так как это то, что я делал. Теперь, в моем представлении я могу либо выйти на PHP, чтобы использовать $callbackController для доступа к родительскому контроллеру, как в

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

или просто используйте механизм Blade

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

Кажется, он отлично работает с несколькими контроллерами и представлениями. Я не заметил штрафа за производительность, используя этот механизм, и у меня есть одна огромная таблица с более чем 50 тыс. Строк.

Я еще не пытался передавать ссылки на другие объекты (например, модели и т.д.), но я не вижу, что бы это не сработало.

Не может быть элегантным, но, похоже, он выполнил свою работу.

Ответ 5

В новой версии 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>

Ответ 6

Вместо того, чтобы передавать функции или запрашивать их на контроллере, я думаю, что вам нужны отношения с моделями, поскольку это связанные таблицы в вашей базе данных.

Если на основе вашей структуры связаны элементы 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

Ответ 7

Вы можете передать его для просмотра, но сначала запросите его в контроллере, а затем после этого добавьте это:

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