Представление и контроллер для страницы загрузки

#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