【问题标题】:Laravel Property does not exist on this collection instance此集合实例上不存在 Laravel 属性
【发布时间】:2019-07-10 21:34:47
【问题描述】:

我需要将数据从 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();

【问题讨论】:

  • Mysq table to another Mysql table 目标表是空的吗?在这种情况下,您可以只使用rename 表...例如,我有一个非常复杂的数据库,但它每天只更新一次,所以在晚上我构建了一个聚合表,对所有数据进行反规范化以进行查询更快更容易。我们还有一个主数据库,在白天进行编辑,但不发布。这是通过每晚的 cron 作业完成(发布)的(当我处理数百万行数据时),所以我构建了一个名为 tmp_table 的表,然后当它完成后,我会覆盖前一天的表。
  • 你用的是哪个版本的 laravel?
  • 这相当于减少停机时间,因为昨天存在的表告诉它已用新数据重命名。而不是处理 25+ 个相关表,我只能使用 2 个。因此,如果您只想用新表清除旧表,您可以执行简单的 RENAME old_table TO new_table 类型查询(抱歉,这个例子太长了)
  • @ArtisticPhoenix 在我的情况下它必须是数据传输,@ Mohammad Zare Moghadam 我正在使用 laravel 5。
  • 就我个人而言,我会在 PURE SQL 中执行此操作,处理大量数据并不是大多数 ORM 所擅长的。 (PS 我不使用 Laravel)但是我使用过 Symphony 和 Doctrine(畏缩,我对 Doctrine 没有印象)......当他们开始轰炸我的数百万行表时,我放弃了 ORM。我有一张包含 1.7 亿行的表,我将其移至 MongoDB(对其糟糕的计数能力没有留下深刻印象)等......大数据问题。

标签: php mysql laravel laravel-5 laravel-4


【解决方案1】:

您可以通过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 方法:

Collection

【讨论】:

  • 谢谢,只是简单的传输,如果数据不在第一个表上,那么它就不会在第二个表中,这种情况下是否有抛出异常的意义?
  • 我想确定 $pdr 是所需类型的对象。你能在这里写出var_dump($pdr) 的输出吗?
  • object(Illuminate\Database\Eloquent\Collection)#233 (1) { ["items":protected]=> array(1) { [0]=> object(App\Panier)# 236 (26) { ["fillable":protected]=> array(6) { [0]=> string(2) "id" [1]=> string(8) "ID_Ligne" [2]=> string( 8) "ID_Piece" [3]=> string(7) "ID_User" [4]=> string(5) "Piece" [5]=> string(3) "QTE" } ...
【解决方案2】:

如果 $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';
            }        
        }
});

【讨论】:

  • 将“each”函数替换为“map”并在回调中返回delete out。然后你会得到删除的集合
【解决方案3】:

当你在做的时候:

$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. Commande 模型中的 ID_UserID_PieceQTE 列标记为 $fillable = []
  2. 您需要有Panier 模型的基本主键,否则delete() 将不起作用。

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 2021-07-23
    • 2021-09-07
    • 2019-04-08
    • 2023-03-12
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多