Laravel Backpack: CRUD для отношений один-много - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть модель с именем Report, которая имеет отношение «один ко многим» с другой моделью с именем ReportAttachments.

В моем классе ReportCrudController у меня есть следующее поле для добавления или управления вложениями.

$this->crud->addField([   // Browse multiple
    'name' => 'attachments',
    'label' => 'Image Attachments',
    'type' => 'browse_multiple',
    'multiple' => true, // enable/disable the multiple selection functionality
    'mime_types' => ['image'], // visible mime prefixes; ex. ['image'] or ['application/pdf']
    'model' => 'App\Models\ReportAttachment',
    'attribute' => 'id',
    'entity' => 'attachments'
]);

Однако я не могу заставить его работать, так как я получаю эту ошибку во время редактирования:

"Свойство [attachments] не существует в этом экземпляре коллекции."

Кроме того, при создании нового отчета генерируется пустой запрос вставки для вложений, который вызывает исключение:

"SQLSTATE [HY000]: общая ошибка: поле 1364 'file 'не имеет значения по умолчанию (SQL: вставить в report_attachments () values ​​()) "

Это код для модели отчета:

class Report extends Model
{
    use CrudTrait;


    protected $table = 'reports';

    protected $fillable = ['name', 'slug', 'description', 'impression'];

    protected $casts = [
        'attachments' => 'array',
    ];


    public function attachments()
    {
        return $this->hasMany('App\Models\ReportAttachment');
    }

}

Код для модели вложения

class ReportAttachment extends Model
{
    protected $table = 'report_attachments';
    protected $primaryKey = 'id';
    protected $fillable = ['file', 'title', 'file_type'];
    public $timestamps = false;


    public function report()
    {
        return $this->belongsTo('App\Models\Report');
    }
}

Я что-то упустил или здесь что-то не так?Заранее спасибо!

Обновление: добавлено определение таблицы и обновлено пространство имен для модели ReportAttachment

CREATE TABLE `reports` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `slug` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `description` longtext COLLATE utf8mb4_unicode_ci,
  `impression` enum('0','1','2') COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `reports_name_unique` (`name`),
  UNIQUE KEY `reports_slug_unique` (`slug`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Таблица report_attachments:

CREATE TABLE `report_attachments` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT '',
  `file` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `file_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `report_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `report_attachments_report_id_foreign` (`report_id`),
  CONSTRAINT `report_attachments_report_id_foreign` FOREIGN KEY (`report_id`) REFERENCES `reports` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
...