#laravel #crud #laravel-backpack #eloquent-relationship
#laravel #crud #laravel-рюкзак #красноречивый-связь
Вопрос:
У меня есть 2 таблицы с отношением «один ко многим».
-
идентификатор портфолио
category_id изображение статуса
-
идентификатор
portfolios_lang идентификаторportfolio_id текст заголовка
lang
Я использовал backpack crud для portfolios_lang и смог создавать записи. Я добавил свою логику в store() в свой PortfolioLangCrudController. Но когда я хочу обновить запись, я не могу сделать так, чтобы поля из портфелей были назначены в зависимости от выбранного мной portfolios_lang. Вот скриншот http://joxi.ru/L21x31Vt08aVgm
То же самое касается списка http://joxi.ru/LmGP76vHleDbO2
Я ничего не смог найти в документации. Есть ли способ сделать это?
Редактировать
class PortfolioLangCrudController extends CrudController
{
use BackpackCRUDappHttpControllersOperationsListOperation;
use BackpackCRUDappHttpControllersOperationsCreateOperation;
use BackpackCRUDappHttpControllersOperationsUpdateOperation;
use BackpackCRUDappHttpControllersOperationsDeleteOperation;
use BackpackCRUDappHttpControllersOperationsShowOperation;
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(AppModelsPortfolioLang::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/portfoliolang');
CRUD::setEntityNameStrings('portfoliolang', 'portfolio_lang');
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
// CRUD::setFromDb(); // columns
$this->crud->addColumn(['name' => 'portfolio_id', 'type' => 'text', 'label' => 'Portfolio Id']);
$this->crud->addColumn(['name' => 'category_id', 'type' => 'text', 'label' => 'Category']);
/* $this->crud->addColumn(['name' => 'category_id', 'type' => 'text', 'label' => 'Category',
'entity' => 'category',
'model' => "AppCategories", // related model
'attribute' => 'name', // foreign key attribute that is shown to user
]);*/
$this->crud->addColumn(['name' => 'title', 'type' => 'text', 'label' => 'Title']);
$this->crud->addColumn(['name' => 'text', 'type' => 'text', 'label' => 'Text']);
$this->crud->addColumn(['name' => 'lang', 'type' => 'text', 'label' => 'Lang']);
$this->crud->addColumn(['name' => 'status', 'type' => 'text', 'label' => 'Status']);
$this->crud->setHeading('Portfolio', 'list');
/**
* Columns can be defined using the fluent syntax or array syntax:
* - CRUD::column('price')->type('number');
* - CRUD::addColumn(['name' => 'price', 'type' => 'number']);
*/
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(PortfolioLangRequest::class);
$statuses = PortfolioLang::$statuses;
$langs = Langs::getLangsArray();
$this->crud->addField(['name' => 'category_id', 'type' => 'select', 'label' => 'Category',
'entity' => 'categories',
'model' => "AppCategories", // related model
'attribute' => 'name', // foreign key attribute that is shown to user
]);
$this->crud->addField(['name' => 'title', 'type' => 'text', 'label' => 'Title']);
$this->crud->addField(['name' => 'text', 'type' => 'ckeditor', 'label' => 'Text']);
$this->crud->addField(['name' => 'lang', 'label' => 'Lang',
'type' => 'select_from_array',
'options' => $langs,
'allows_null' => false,
//'default' => 1,
]);
$this->crud->addField(['name' => 'portfolio_id', 'type' => 'hidden', 'label' => 'Portfolio']);
$this->crud->addField(['name' => 'status', 'label' => 'Status',
'type' => 'select_from_array',
'options' => $statuses,
'allows_null' => false,
'default' => 1,
]);
$this->crud->addField(['name' => 'image', 'type' => 'image', 'label' => 'Image',
'crop' => true, // set to true to allow cropping, false to disable
// 'aspect_ratio' => 1, // ommit or set to 0 to allow any aspect ratio
]);
$this->crud->setHeading('Portfolio', 'create');
//CRUD::setFromDb(); // fields
/**
* Fields can be defined using the fluent syntax or array syntax:
* - CRUD::field('price')->type('number');
* - CRUD::addField(['name' => 'price', 'type' => 'number']));
*/
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
CRUD::setValidation(PortfolioLangRequest::class);
$statuses = PortfolioLang::$statuses;
$langs = Langs::getLangsArray();
$this->crud->addField(['name' => 'category_id', 'type' => 'select', 'label' => 'Category',
'entity' => 'categories',
'model' => "AppCategories", // related model
'attribute' => 'name', // foreign key attribute that is shown to user
]);
$this->crud->addField(['name' => 'title', 'type' => 'text', 'label' => 'Title']);
$this->crud->addField(['name' => 'slug', 'type' => 'text', 'label' => 'Slug']);
$this->crud->addField(['name' => 'text', 'type' => 'ckeditor', 'label' => 'Text',]);
$this->crud->addField(['name' => 'lang', 'label' => 'Lang',
'type' => 'select_from_array',
'options' => $langs,
'allows_null' => false,
// 'default' => 1,
]);
$this->crud->addField(['name' => 'portfolio_id', 'type' => 'hidden', 'label' => 'Portfolio']);
$this->crud->addField(['name' => 'status', 'label' => 'Status',
'type' => 'select_from_array',
'options' => $statuses,
'allows_null' => false,
'default' => 1,
]);
$this->crud->addField(['name' => 'image', 'type' => 'image', 'label' => 'Image',
'crop' => true, // set to true to allow cropping, false to disable
// 'aspect_ratio' => 1, // ommit or set to 0 to allow any aspect ratio
]);
$this->crud->setHeading('Portfolio', 'update');
// $this->setupCreateOperation();
}
public function store(PortfolioLangRequest $request)
{
$input = $request->all();
// var_dump($input['category_id']);
$portfolios = new Portfolios();
$portfolios->category_id = $input['category_id'];
$portfolios->status = $input['status'];
$portfolios->image = $input['image'];
$portfolios->save();
$portfolio_lang = PortfolioLang::where(
'lang', '=', $input['lang']
)->where('portfolio_id', '=', $portfolios->id)->first();
if (empty($portfolio_lang)) {
$portfolio_lang = new PortfolioLang();
}
$portfolio_lang->title = $input['title'];
$portfolio_lang->text = $input['text'];
$portfolio_lang->lang = $input['lang'];
$portfolio_lang->portfolio_id = $portfolios->id;
$portfolio_lang->save();
return redirect('admin/portfoliolang');
}
public function update(PortfolioLangRequest $request)
{
$input = $request->all();
$portfolio_id = $request->input('portfolio_id');
$portfolio_lang = PortfolioLang::where(
'lang', '=', $input['lang']
)->where('portfolio_id', '=', $portfolio_id)->first();
if (empty($portfolio_lang)) {
$portfolio_lang = new PortfolioLang();
}
$portfolio_lang->title = $input['title'];
$portfolio_lang->text = $input['text'];
$portfolio_lang->lang = $input['lang'];
$portfolio_lang->portfolio_id = $portfolio_id;
$portfolio_lang->save();
return redirect('admin/portfoliolang');
}
}
РЕДАКТИРОВАТЬ 2
Спасибо, я смог показать категории в списке
$this->crud->addColumn(['name' => 'portfolio_id', 'type' => 'select',
'label' => 'Category', 'model' => "AppCategories",'attribute' => 'name','entity' => 'portfolio.category',
'key'=>'categoryName']);
Но разве я не могу редактировать связанные поля из одной формы?
Комментарии:
1. пожалуйста, поделитесь ПортфолиоLangCrudController
2. @OMR, спасибо за ваш ответ. Я добавил свой код PortfolioLangCrudController в описание
3. вы имеете в виду, что вы не можете получить статус и название категории в операции обновления и списка?
4. @OMR, да, я не могу получить все связанные поля. Они пусты, потому что я не знаю, как их назначить. Если я обновлю запись из portfolio_lang, связанные поля из портфелей будут пустыми. Я пытаюсь сделать это из одной формы.
5. @OMR, я не знаю, что произошло, но ваш ответ исчез. Я смог показать категории. Большое вам спасибо)