Laravel - несколько форм / таблиц - перенести переменную в URL для заполнения столбца таблицы - PullRequest
0 голосов
/ 22 февраля 2019

Я довольно новичок в кодировании и в Laravel (использую 5.7).Я понял, как создать простую одностраничную форму для заполнения таблицы в базе данных, включая перезапуск и аутентификацию, но у меня возникают трудности при переходе на следующий уровень. Приложение, которое я хочу разработать, будет иметь несколько форм и таблиц, и я не могу понять, как связать информацию, собранную из первой формы, со следующей.

Давайте рассмотрим базу данных с: - таблица клиентов (заполняемая через страницу формы A), например: одно поле является полем client_id.- таблица продуктов (заполняемая через страницу формы B) - (в конечном итоге их будет больше)

Когда пользователь (например, сотрудник компании, анализирующий поведение клиентов) завершает заполнение страницы формы A (URL: /клиенты, метод GET: Clientcontroller @ create, просмотр clients.create.blade.php), он / она нажимает Next.

Моя идея состоит в том, что кнопка Next должна: - передавать информацию в таблицу Client (метод POST): Clientscontroller @ store) - и перенаправьте пользователя на страницу B формы, передавая client_id в URL (URL: / products / {client_id} / create, метод GET: Productscontroller @ create, просмотрите products.create.blade.php).

В таблице «Продукт» у меня есть столбец client_id, и у меня есть отношение один ко многим между моделью «Клиенты и продукты».

После отправки формы B мне бы хотелосьизвлечь {client_id} из URL, чтобы заполнить столбец client_id таблицы Product, но я застрял здесь.Буду признателен за советы и советы.Для упрощения процесса обучения я считаю, что клиенты покупают только один продукт.

ОСНОВНОЙ ВОПРОС: - Как извлечь параметр {client_id} из URL-адреса products.create.blade.php view, чтобы внедрить его в клиентское представление (уже много чего пробовал от ответа на похожие вопросы в stackoverflow) ТАКЖЕ: - Использую ли я правильный подход?Любые предложения / советы?

ДОПОЛНИТЕЛЬНЫЙ ВОПРОС, немного выходящий за рамки: - Любой намек на то, как реализовать добавление / удаление полей для продуктов?

ВЕБ-МАРШРУТЫФАЙЛ:

> <?php
>     Route::get('/', 'PagesController@welcome')->name('welcome');
>     Auth::routes();
>     //ROUTES FOR CLIENT
>     Route::resource('clients','ClientsController');
>     //ROUTES FOR PRODUCT (please note the {client_id} parameter)
>     Route::get('/products/{client_id}/create', 'ProductsController@create')->name('products.create');
>     Route::post('/products/{client_id}', 'ProductsController@store')->name('products.store');
>     //not sure if it should be Route::post('/products', 'ProductsController@store')->name('products.store');

КОНТРОЛЛЕР КЛИЕНТА:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Client; //THIS IS THE CLIENT MODEL
use App\User; ////THIS IS THE USER MODEL
class ClientsController extends Controller
{
    AUTH
    public function __construct()
            {
                $this->middleware('auth');
            }

    //INDEX (CLIENT)
    public function index()
        {
            //my code here
        }

    //CREATE (CLIENT)
    public function create()
        {
            $datas=[
            'controllermethod' => 'ClientsController@store',
            'client_id_field' => [
                        'input_type_l' => 'textinput',
                        'input_name_l' => 'client_id', //this what i am carrying over in URL
                        'input_label_l' => 'Client ID :',
                        'input_placeholder_l' => 'XXXXX',
                        'input_default_l' => ''
                ],
            'client_info_1_field' => [
                        'input_type_l' => 'textinput',
                        'input_name_l' => 'client_info_1'
                        'input_label_l' => 'Client Info 1 :',
                        'input_placeholder_l' => 'XXXXX',
                        'input_default_l' => ''
                ],
            'client_info_2_field' => [
                        'input_type_l' => 'textinput',
                        'input_name_l' => 'client_info_2'
                        'input_label_l' => 'Client Info 2 :',
                        'input_placeholder_l' => 'XXXXX',
                        'input_default_l' => ''
                ]
                    ],
        return view ('clients.create')->with($datas);
        }

    //STORE (CLIENT)
    public function store(Request $request)
            {
                $this->validate($request, [
                        'client_id' => 'required',
                ]);

                $client = new Client;
                $client->client_id = $request->input('client_id');
                $client->client_info_1 = $request->input('client_info_1');
                $client->client_info_2 = $request->input('client_info_2');
                $client->user_id = auth()->user()->id; //one to many relashionship betw user/client models
                $client->save();

            //          
            //this is how I inject the {client_id} parameter onto the URL
            //this works, the products.create view is displayed, the URL contain the client_id from formA entered by the user
            $client_id = $request->client_id;
            return redirect("/products/$client_id/create")->with('client_id', $client_id)
                                       ->with('success','New client record created');

    //SHOW/DESTROY/EDIT/UPDATE FUNCTIONS....all this work

КОНТРОЛЛЕР ПРОДУКЦИИ =ЭТО БЫЛО Я УСТОЙЧИВО + НЕ УВЕРЕН, ЕСЛИ ЭТО ПРАВИЛЬНЫЙ ПОДХОД

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
//note sure if I need that
//use Illuminate\Routing\Route;
use App\Product;
use App\Client;
use App\User;

class ProductsController extends Controller
{   
        //AUTH
    public function __construct()
            {
                $this->middleware('auth');
            }

    //INDEX (PRODUCT)
        public function index()
        {
            //no code so far
        }

    //INDEX (PRODUCT)
    public function create()
        {
            $datas=[
                    'controllermethod' => 'ProductsController@store',
                //planning of having dynamic add/remove products fields but let's keep it simple (1 client -> 1 product)
            'product_id_field' => [
                        'input_type_l' => 'textinput',
                        'input_name_l' => 'product_id',
                        'input_label_l' => 'Date of cancer diagnosis :',
                        'input_default_l' => ''
                ],
            'product_info_1_field' => [
                        'input_type_l' => 'textinput',
                        'input_name_l' => 'product_info_1'
                        'input_label_l' => 'Product Info 1 :',
                        'input_placeholder_l' => 'XXXXX',
                        'input_default_l' => ''
                ],
            'product_info_2_field' => [
                        'input_type_l' => 'textinput',
                        'input_name_l' => 'product_info_2'
                        'input_label_l' => 'Product Info 2 :',
                        'input_placeholder_l' => 'XXXXX',
                        'input_default_l' => ''
                ]
                    ],
        //Below, I am not sure I should do that
        return view ('products.create')->with($datas);
        }

    // STORE (PRODUCT) = THAT's WHERE I AM STUCK
    // everything works except that the client_id column in the products table stays empty or filled with crap

    public function store(Request $request)
        {

        //NOT SURE WHAT TO DO HERE TO RETRIEVE THE {client_id} from the "/products/$client_id/create" ...
    //TO FURTHER INJECT IT AS A VALUE IN THE client_id COLUMN OF THE PRODUCT TABLE
    //I KNOW IT's CRAP, but I TRIED THINGS ALONG THOSE LINES:   
    //return $client_id;
        //$client_id = request()->route()->paremeters('client_id');
        //$client_id = request()->route('client_id');
        //$client_id = $request->client_id;
    //$client_id = url('client_id');


        $product = new Diagnosis;
        $product->product_id = $request->input('product_id');
        $product->product_info_1 = $request->input('product_info_1');
        $product->product_info_2 = $request->input('product_info_2');
        $product->user_id = auth()->user()->id;
    //I KNOW IT's CRAP, but I TRIED THINGS ALONG THOSE LINES:        
    //$diagnosis->client_id =  $client_id; //NB: if I write $diagnosis->client_id =  'whatever'; it works
        $diagnosis->save();

        //redirect to client.index view
    return redirect('/clients')->with('success','New patient diagnosis (-es) created'); 

    }

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вот альтернативное решение, которое тоже работает:

МАРШРУТЫ:

Route::get('/products/{client_id}/create', 'ProductsController@create')-name('products.create');
Route::post('/products', 'ProductsController@store')->name('products.store');

ФУНКЦИЯ СОЗДАНИЯ ПРОДУКТА:

public function create() //keep as in the original question
{
  // all your code ... 
  return view ('products.create')->with("data",$datas)->with("client_id",$request->client_id);
}

В ПРОСМОТРЕ:

<form>
  <!-- other inputs .... -->
  <input type="hidden" value="{{Request::segment(2)}}" name="client_id" /> //access the URL segmment 2 which correspond to the client_id
</form>

В ФУНКЦИИ ХРАНЕНИЯ ПРОДУКТА КОНТРОЛЛЕРА:

$client_id = $request->input('client_id')

Было бы неплохо использовать Request :: сегмента (2) непосредственно в функции хранилища, как это, но это вызываетОшибка «Нестатический метод Illuminate \ Http \ Request :: сегмент () не должна вызываться статически», которую мне не удалось устранить.Мне не нужен ответ на это, однако намек был бы оценен в любом случае .Может быть, я отправлю новый вопрос, если это еще не решено.

0 голосов
/ 22 февраля 2019

наше решение будет начинаться с просмотра этого маршрута:

Route::get('/products/{client_id}/create','ProductsController@create')->name('products.create');

это маршрут, который содержит ваш client_id, который мы хотим получить, и, поскольку это значение находится на ссылке, мы можем использовать Запрособъект для доступа к нему!

, как я уже сказал, объект $ request уже содержит значение client_id, поэтому нам нужно получить его и отправить в качестве параметра в представление с помощью функции with, поэтому в основномваш ProductsController @ create будет выглядеть так:

public function create(Request $request) 
{
  // all your code ... 
  return view ('products.create')->with("data",$datas)->with("client_id",$request->client_id);
}

, так что теперь мы получаем доступ к этому значению с нашей точки зрения, верно?идея состоит в том, чтобы добавить это значение в качестве скрытого ввода в форме продукта!(что-то вроде этого)

<form>
  <!-- other inputs .... -->
  <input type="hidden" value="{{$client_id}}" name="client_id" />
</form>

после отправки формы этот маршрут будет называться:

Route::post('/products/{client_id}', 'ProductsController@store')->name('products.store');

, так как client_id будет отправлен через форму и не использует ссылку, онбыло бы лучше, если бы вы изменили свой маршрут на

Route::post('/products', 'ProductsController@store')->name('products.store');

сейчас, мы можем получить доступ к нашему значению в функции хранилища, просто используя

$client_id = $request->input('client_id')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...