#laravel
#laravel
Вопрос:
Мне нужно создать страницу загрузки. У меня есть модель продукта и файл модели. Создание / сохранение и редактирование / обновление уже работают. С помощью кнопки отправки я сохраняю такие поля, как productname, description и т.д., в таблицу продуктов. Такие поля, как filename, filePath и product_id, сохраняются в files-table. Файлы также загружаются в хранилище. Модель продукта имеет отношение hasMany к файлу, а файл модели имеет отношение belongsTo к продукту. В модели файла «product_id» относится к модели продукта.
Пока все хорошо. Что также работает: индексный просмотр FileController. Я могу видеть все загруженные файлы, а также загружать их. Через product_id я могу получить доступ к фактическому методу отображения продукта. Так и должно быть. Это возможно здесь, в index.blade.php:
@foreach ($files as $file)
<tr>
<th>{{ $file->filename }}</th>
<td><a href="{{ $file->filepath }}">download</a></td>
<td><a href="/products/{{ $file->product_id }}">{{ $file->product_id }}</a></td>
<td>{{ $file->id }}</td>
</tr>
@endforeach
В show.blade.php Я уже вижу все данные из таблицы продуктов. У меня есть две кнопки для загрузки журнала изменений (просто ссылка) и работы, а также для загрузки сохраненного файла (который находится в таблице файлов. Я не могу заставить его работать для загружаемого сохраненного файла. dd($files);
равно НУЛЮ. Вот часть, показывающая ProductController. Я применил use AppFile;
поверх контроллера, потому что хочу предоставить возможность доступа к файловой модели.
public function show(Product $product)
{
return view('products.show', compact('product','file'));
}
В show.blade.php Я получаю сообщение об ошибке: compact(): Неопределенная переменная: file
<div>
<button id="changelog" name="changelog" class="btn btn-lg btn-primary btn-block" type="submit" onclick="window.open('{{ $product->changelog }}')">Download Changelog</button>
<button id="filename" name="filename" class="btn btn-lg btn-success btn-block" type="submit" onclick="window.open('{{ $file->filename }}')">Download Installer</button>
</div>
Как я могу получить доступ к элементу другой модели или другой таблицы? Как я могу развернуть {{ $file->filename }}
или, возможно {{ $product->$file->filename }}
, получить файл для загрузки?
Я пытаюсь со дня на день и не могу найти решение.
Комментарии:
1. Пожалуйста, приложите модель вашего продукта и модель файла
2. Потому что вы не определили
$file
переменную вshow
функции
Ответ №1:
Спасибо, что откликнулся. У меня все еще есть проблемы с построением Eloquent и запросов, но использование dd od var_dump очень помогает и показало мне, что у меня есть ценные данные. Проблема заключалась в том, чтобы определить запрос. Вот рабочий материал:
Модель продукта:
public function file()
{
return $this->hasMany('AppFile', 'product_id');
}
Модель файла:
public function product()
{
return $this->hasOne('AppProduct', 'id');
}
Контроллер продукта:
public function show(Product $product)
{
$files = Product::with('file')->find($product->id)->file;
return view('products.show', compact('product', 'files'));
}
показать представление:
@foreach ($files as $file)
<button id="filepath" name="filepath" class="btn btn-lg btn-success btn-block" type="submit" onclick="window.open('{{ $file->filepath }}')">Download File: {{ $file->filename }}</button>
@endforeach