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
Я решаю проблему. Так просто. Ошибка синтаксиса.
![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'));