array_map (): аргумент № 2 должен быть массивом - PullRequest
0 голосов
/ 07 июня 2019

Я получаю эту ошибку array_map(): Argument #2 should be an array, когда пользователь пытается создать продукт

Я изменил свой код из этих решений Как заставить каждого аутентифицированного пользователя видеть только свой собственный продукт , и теперь он выдает мне эту ошибку.

ProductController

class productController extends Controller
{

public function index(Request $request)
{
    $userId = $request->user()->id;
    $products = products_model::where('user_id', $userId)->get();
   return view('seller.product.index',compact('products'));
}




public function create()
{  
    return view('seller.product.create');
}

public function seller()
{
   $products=products_model::all();
   return view('seller.product.index',compact('products'));
}


public function store(Request $request)
{

    $formInput=$request->except('image');
    $this->validate($request, [
     'pro_name'=> 'required',
     'pro_price'=> 'required',
     'pro_info'=> 'required',
     'user_id' => \Auth::id(),
     'image'=>'image|mimes:png,jpg,jpeg|max:10000'
    ]);

    $image=$request->image;
    if($image){
        $imageName=$image->getClientOriginalName();
        $image->move('images', $imageName);
        $formInput['image']=$imageName;
    }

    products_model::create($formInput);
    return redirect()->back();
}


public function show($id)
{
    //
}


public function edit($id)
{
    //
}


public function update(Request $request, $id)
{
    //
}


public function destroy($id)
{
   $userId = $request->user()->id();
   $deleteData=products_model::where('user_id', $userId)->findOrFail($id);
   $deleteData->delete();

   return redirect()->back();
}
}

Products_model

class products_model extends Model
{
protected $table='products';
protected $primaryKey='id';
protected $fillable= ['user_id','pro_name','pro_price','pro_info','image','stock','category_ id'];
}

Таблица продуктов

class CreateProductsTable extends Migration
{

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('pro_name');
        $table->integer('pro_price');
        $table->text('pro_info');
        $table->integer('stock');
        $table->string('image')->nullable();
        $table->timestamps();

        $table->bigInteger('user_id')->unsigned()->index();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}


public function down()
{
    Schema::dropIfExists('products');
}
}

После обновления мой код теперь получает эту ошибку SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into продукты ( pro_name , pro_price , акции , pro_info , i`

1 Ответ

0 голосов
/ 08 июня 2019

Измените свою функцию проверки.Вместо использования $this->validate(), используйте метод $request->validate():

$request->validate([
   'pro_name'=> 'required',
   'pro_price'=> 'required',
   'pro_info'=> 'required',
   'user_id' => 'required|integer',
   'image'=>'image|mimes:png,jpg,jpeg|max:10000'
]);

Если правила проверки пройдут, ваш код будет работать нормально;однако, если проверка не пройдена, будет выдано исключение, и правильный ответ об ошибке будет автоматически отправлен обратно пользователю.

Другое решение:

Добавить

use Validator;

для вашего класса.

$validator = Validator::make($request->all(), [
    'pro_name'=> 'required',
    'pro_price'=> 'required',
    'pro_info'=> 'required',
    'user_id' => 'required|integer',
    'image'=>'image|mimes:png,jpg,jpeg|max:10000'
]);

if($validator->fails()){
    //Validation does not pass logic here
}else{
    //
}

Еще один: Создание запроса формы , с

phpartisan make: request RequestName

Файл будет создан в каталоге app\Http\Requests.

В этом файле добавьте свои правила к методу rules:

public function rules()
{
    return [
       'pro_name'=> 'required',
       'pro_price'=> 'required',
       'pro_info'=> 'required',
       'user_id' => 'required|integer',
    ];
}

Измените метод authorize, чтобы получить true:

public function authorize()
{
    return true;
}

В вашем методе store поменяйте Request $request на RequestName $request.Теперь вам не нужно проверять метод $request inside store.Он будет сохранен, только если проверка прошла успешно;

Ваш метод store теперь должен выглядеть следующим образом:

public function store(RequestName $request)
{
    $formInput=$request->except('image');

    $image=$request->image;
    if($image){
        $imageName=$image->getClientOriginalName();
        $image->move('images', $imageName);
        $formInput['image']=$imageName;
    }

    products_model::create(array_merge(
        $formInput, ['user_id' => Auth::user()->id]
    ));
    return redirect()->back();
}

Не забудьте use App \ Http \ Requests \RequestName

Если проверка не пройдена, будет сгенерирован ответ на перенаправление, чтобы отправить пользователя обратно в его предыдущее местоположение.Ошибки также будут мигать в сеансе, чтобы они были доступны для отображения.Если запрос был запросом AJAX, пользователю будет возвращен HTTP-ответ с кодом состояния 422, включая JSON-представление ошибок проверки.Вы можете узнать больше о проверке запроса здесь .

[РЕДАКТИРОВАТЬ] Я изменяю правило users_id на user_id, чтобы соответствовать вашему внешнему ключу.Я думаю, что вы сделали опечатку здесь, когда вы задали вопрос.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...