【问题标题】:array_map(): Argument #2 should be an arrayarray_map():参数 #2 应该是一个数组
【发布时间】:2019-10-23 08:33:20
【问题描述】:

当用户尝试创建产品时,我收到此错误array_map(): Argument #2 should be an array

我从这个解决方案How to make each authenticated user only see their own product 更改了我的代码,现在它给了我这个错误。

产品控制器

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 intoproducts(pro_name,pro_price,stock,pro_info,i`

【问题讨论】:

  • 什么函数给你这个错误?
  • @MateusJunges 存储功能。 vendor/laravel/framework/src/Illuminate/Validation/ValidationRuleParser.php 并突出显示这一行 return array_map([$this, 'prepareRule'], $rule)

标签: php arrays laravel laravel-5


【解决方案1】:

更改您的验证功能。而不是使用$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{
    //
}

还有一个: 创建一个form request,使用

php artisan 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 $requestRequestName $request 交换。 现在您不需要在store 方法中验证$request。只有验证成功才会去存储;

您的 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();
}

别忘了useApp\Http\Requests\RequestName

如果验证失败,将生成重定向响应以将用户发送回之前的位置。错误也将闪现到会话中,以便显示。如果请求是 AJAX 请求,将向用户返回带有 422 状态代码的 HTTP 响应,其中包括验证错误的 JSON 表示。 您可以了解有关请求验证的更多信息here

[编辑] 我将users_id 规则更改为user_id,以匹配您的外键名称。 我想你在问这个问题时在这里打错了。

希望对你有帮助。

【讨论】:

  • 评论不用于扩展讨论;这个对话是moved to chat
  • @BhargavRao 对此感到抱歉
猜你喜欢
  • 2016-02-09
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
相关资源
最近更新 更多