Laravel backpack crud для обновления и списка со связью

#laravel #crud #laravel-backpack #eloquent-relationship

#laravel #crud #laravel-рюкзак #красноречивый-связь

Вопрос:

У меня есть 2 таблицы с отношением «один ко многим».

  1. идентификатор портфолио

    category_id изображение статуса

  2. идентификатор
    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, я не знаю, что произошло, но ваш ответ исчез. Я смог показать категории. Большое вам спасибо)