【问题标题】:array_map(): Argument #2 ($array) must be of type array, int given this error is showingarray_map(): 参数 #2 ($array) 必须是数组类型,int 给出这个错误
【发布时间】:2021-05-23 03:23:52
【问题描述】:

我希望用户拥有许多产品。有一些产品属于一个用户。但它显示 array_map(): Argument #2 ($array) must be of type array, int given error。我认为控制器中存在一些问题,但我无法修复它。谁来帮帮我。谢谢是提前 这是我的 ProductController.php

<?php

namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Requests\Admin\StoreTagsRequest;
use App\Models\User;
use Illuminate\Support\Facades\Hash;

class ProductController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $products = Product::latest()->paginate(20);

        return view('products.index',compact('products'))

            ->with('i', (request()->input('page', 5) - 1) * 5);
    }

    function authapi(Request $request)
    {
        $user = User:: where('email', $request->email)->first();
        if(!$user || !Hash::check($request->password, $user->password)){
            return response([
                'message' => ['These credentials do not match our records.']
            ],404);
        }

        $token = $user -> createToken('my-app-token')->plainTextToken;

        $response = [
            'user' => $user,
            'token' => $token
        ];

        return response($response,201);
    }

    function all_app_jsons(){
        return Product::all();
    }

    function search_by_name($name){
        return Product::where('name','like','%'.$name.'%')->get();
    }

    function search_by_id($id){
        return Product::where('id',$id)->get();
    }
    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('products.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //$tag = Product::create($request->all());

        //return redirect()->route('admin.tags.index');
        $request->validate([
            'name' => 'required',
            'detail' => 'required',
            'color' => 'required',
            'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
            'logo' => 'required|mimes:jpeg,png,jpg,gif,svg|max:1024',
        ]);

        // $input = $request->all();
        $request->validated();
        $input['user_id'] = auth()->user()->id;

        if ($image = $request->file('image')) {
            $destinationPath = 'image/';
            $profileImage = date('YmdHis') . "." . $image->getClientOriginalExtension();
            $image->move($destinationPath, $profileImage);
            $input['image'] = "$profileImage";
        }

        if ($logo = $request->file('logo')) {
            $destinationPath = 'logo/';
            $profileLogo = date('YmdHis') . "." . $logo->getClientOriginalExtension();
            $logo->move($destinationPath, $profileLogo);
            $input['logo'] = "$profileLogo";
        }

        Product::create($input);

        return redirect()->route('products.index')
                        ->with('success','Product created successfully.');
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function show(Product $product)
    {
        return view('products.show',compact('product'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function edit(Product $product)
    {
        return view('products.edit',compact('product'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, Product $product)
    {
        $request->validate([
            'name' => 'required',
            'detail' => 'required',
            'color' => 'required'
        ]);

        $input = $request->all();

        if ($image = $request->file('image')) {
            $destinationPath = 'image/';
            $profileImage = date('YmdHis') . "." . $image->getClientOriginalExtension();
            $image->move($destinationPath, $profileImage);
            $input['image'] = "$profileImage";
        }else{
            unset($input['image']);
        }

        if ($logo = $request->file('logo')) {
            $destinationPath = 'logo/';
            $profileLogo = date('YmdHis') . "." . $logo->getClientOriginalExtension();
            $logo->move($destinationPath, $profileLogo);
            $input['logo'] = "$profileLogo";
        }else{
            unset($input['logo']);
        }

        $product->update($input);

        return redirect()->route('products.index')
                        ->with('success','Product updated successfully');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Product  $product
     * @return \Illuminate\Http\Response
     */
    public function destroy(Product $product)
    {
        $product->delete();

        return redirect()->route('products.index')
                        ->with('success','Product deleted successfully');
    }

    // function indextwo(){
    //     //return DB::select("select * from  products");
    //    //DB::table('products')->orderBy('id','desc')->first();
    //    return Product::orderBy('id', 'DESC')->first();
    // }

}

这是我的 Product.php 作为模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    use HasFactory;

    protected $fillable = [
        'name', 'detail', 'image','color','logo','user_id'
    ];

    public function user(){
        return $this->belongsTo(User::class);
    }
}

这是我的 user.php 作为模型

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Fortify\TwoFactorAuthenticatable;
use Laravel\Jetstream\HasProfilePhoto;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens;
    use HasFactory;
    use HasProfilePhoto;
    use Notifiable;
    use TwoFactorAuthenticatable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
        'two_factor_recovery_codes',
        'two_factor_secret',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /**
     * The accessors to append to the model's array form.
     *
     * @var array
     */
    protected $appends = [
        'profile_photo_url',
    ];

    public function products(){
        return $this->hasMany(Product::class);
    }
}

这是我的产品表

public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('detail');
            $table->string('color');
            $table->string('image');
            $table->string('logo');
            $table->unsignedBigInteger('user_id');
            $table->timestamps();
        });
        Schema::table('products', function (Blueprint $table){
            $table->foreign('user_id')->references('id')->on('users');

        });
    }

【问题讨论】:

  • 你的代码中的array_map()在哪里?
  • 我不知道。它应该在哪里,你能帮我吗?我在过去的 4 个小时里都在挣扎
  • 什么是错误堆栈跟踪?错误是您在期望数组时传递了一个非数组。您的错误报告应该告诉您 ProductController 的哪一行正在执行此操作。哪条线?
  • 它在我的 ProductController 中没有显示任何错误,但在 ValidationRuleParser.php 第 92 行显示错误

标签: php laravel laravel-8


【解决方案1】:

问题在于您的ProductController 中的这段代码:

            'user_ID' => auth()->user()->id,

它会出错,因为那里有实际的用户 ID,而不是验证规则。

我假设您希望用户 ID 成为当前用户 ID 并想要验证它,您可以但不喜欢这样。

如果您想确保输入中的 user_id 始终是经过身份验证的用户 ID,请使用:

$input = $request->all();
$input['user_id'] = auth()->user()->id;

错误是因为用户ID可能是一个整数值,如果我们查看发生错误的代码ValidationRuleParser:92,您可以看到它检查字符串和对象,否则将未修改的值传递给array_map,因为你传递了一个整数,所以它会给你你看到的错误。有点棘手,但堆栈跟踪应该包含一个源自您的控制器的帧,特别是 $request-&gt;validate 调用。


虽然技术上不是您的问题的一部分,但我想警告您不要使用 $request-&gt;all(),因为这可能会引入额外的数据,这些数据会在未经验证或预期的情况下传递给您的模型。而是使用$request-&gt;validated() 仅获取经过验证的值。您的模型上还设置了$fillable,所以这不是一个直接的问题,但我仍然建议只传递经过验证的字段,以防$fillable 已扩展但验证规则未扩展。

【讨论】:

  • 非常感谢它的工作。但我可以评估具有不同 ID 的相同产品。但我希望用户 id 将有不同的产品,不能用不同的 id 评估。你可以看到我有产品表的更新代码
  • 你能帮我解决这个问题吗?
  • 这是一个完全不同的问题,对吧?问题出在创建产品的 store 方法中,应该与访问它们无关?
  • 是的,非常感谢你,在你帮助我的最后 6 个小时里,我一直在挣扎:)。但如果你不能帮助我其他的很好,谢谢:)
  • 我可以,但从技术上讲,这对于这个问题来说是题外话......所以我会在这里快速介绍一下,但如果它无助于创建一个新问题。在您的控制器 update 方法中,将 , Product $product 替换为 , $productId 并添加为方法的第一行:$product = auth()-&gt;user()-&gt;products()-&gt;findOrFail($productId);。这应该确保只能编辑属于经过身份验证的用户的产品,或者查看:laravel.com/docs/8.x/routing#implicit-model-binding-scoping(但取决于您的路线设置,这可能不适合您)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 2020-01-06
  • 2016-02-09
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2017-01-14
相关资源
最近更新 更多