Laravel 属性 在此集合实例上不存在

Laravel Property does not exist on this collection instance

我需要将数据从 Mysq table (Paniers) 传输到另一个 Mysql table (Commandes) 并在传输后删除第一个 table 的数据。

这是我的代码:

function Commande(Request $request) { 
        $pn = $request->input('id'); 
        $pdr = Panier::find($pn);
        $user = Commande::create([
        'ID_User'    => $pdr->ID_User,
        'ID_Piece'   => $pdr->ID_Piece,
        'QTE'        => $pdr->QTE,
        ]);
        if($user){
            if($pdr->delete())
            {
                echo 'Commande Confirmée';
            }        
        }
    }

我收到这个错误:

"Property [ID_User] does not exist on this collection instance."

如果我这样做,它会起作用,但我没有获取所有数据,而是只获取了第一行。我需要获取所有行的数据!

$pdr = Panier::find($pn)->first();

您可以通过 findOrFail 和处理 Exception:

来完成
function Commande(Request $request) {
    $pn = (int) $request->input('id');
    try {
        $pdr = Panier::findOrFail($pn);
        $pdr->each(function ($item, $key) {
            $user = Commande::create([
                'ID_User'    => $item->ID_User,
                'ID_Piece'   => $item->ID_Piece,
                'QTE'        => $item->QTE,
            ]);
            if ($user && $item->delete()) {
                echo 'Commande Confirmée';
            } 
        });
    } catch (Illuminate\Database\Eloquent\ModelNotFoundException $e) {
        //@Todo handle error
    }
}

根据 laravel 5.0 文件:

Retrieving A Model By Primary Key Or Throw An Exception

Sometimes you may wish to throw an exception if a model is not found. To do this, you may use the firstOrFail method:

Collection

如果 $pn 是数组 Panier::find($pn) returns 集合不是实体所以你应该迭代它

Panier::find($pn)->each(function($pdr){
    $user = Commande::create([
        'ID_User'    => $pdr->ID_User,
        'ID_Piece'   => $pdr->ID_Piece,
        'QTE'        => $pdr->QTE,
        ]);
   if($user){
        if($pdr->delete())
            {
                echo 'Commande Confirmée';
            }        
        }
});

当你在做的时候:

$pdr = Panier::find($pn);

如果记录不存在,则returnnull。然后如果你做 $pdr->ID_User 它会抛出一个错误。请检查以下更新:

<?php 

function Commande(Request $request) {

    $pn = $request->input('id'); 

    $pdr = Panier::find($pn);
    // Model not found
    if(!$pdr){
        return response()->json(['msg' => 'No records found']);

    }
    // Create new Commande
    $user = Commande::create([
        'ID_User'    => $pdr->ID_User ?? 'default_value_for_ID_User',
        'ID_Piece'   => $pdr->ID_Piece ?? 'default_value_for_ID_Piece',
        'QTE'        => $pdr->QTE ?? 'default_value_for_QTE'
    ]);
    // If user is created
    if($user){

        // Delete Panier
        $pdr->delete();
        return response()->json(['msg' => 'Success']);
    }

    return response()->json(['msg' => 'Could not create new Commande']);
}

要使上述工作正常,您需要:

  1. ID_UserID_PieceQTECommande 模型中标记为 $fillable = []
  2. 你需要有一个Panier模型的基本主键,否则delete()将无法工作。