Свойство Laravel не существует в этом экземпляре коллекции - PullRequest
0 голосов
/ 17 февраля 2019

Мне нужно перенести данные из таблицы Mysq (Paniers) в другую таблицу Mysql (Commandes) и удалить данные из первой таблицы после передачи.

Вот мой код:

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();

Ответы [ 3 ]

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

Если $ pn - это массив, Panier :: find ($ pn) возвращает коллекцию, а не сущность, поэтому вы должны выполнить итерацию

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';
            }        
        }
});
0 голосов
/ 17 февраля 2019

Когда вы делаете:

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

Если запись не существует, она вернет null.Тогда, если вы сделаете $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_User, ID_Piece и QTE, помеченные как $fillable = [] вCommande Модель.
  2. Вам необходим базовый первичный ключ для Panier Модель, иначе delete() не будет работать.
0 голосов
/ 17 февраля 2019

Вы можете сделать это с помощью 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:

Получение модели по первичному ключу или сгенерироватьИсключение

Иногда вы можете вызвать исключение, если модель не найдена.Для этого вы можете использовать метод firstOrFail:

Коллекция

...