【问题标题】:Can't delete an object when using a different database connection使用不同的数据库连接时无法删除对象
【发布时间】:2021-07-14 17:41:13
【问题描述】:

我有一张桌子

当我删除时,我不断得到

注意:我使用表名 babySettings 连接到特定的数据库驱动程序 babies

我不知道为什么我不能删除这个:

public function destroy($id)
{

    $inputs  = Request::all();
    $baby    = DB::connection('babies')->table("babySettings")->find($id);
    $oldBaby = $baby;

    $deleteLock = [1,2,3];


    if(in_array((int)$id,$deleteLock)) {
        return Redirect::to('/baby') ->with('error', 'F* off');
    }

    if($baby){

        $logs   = DB::connection('babies')->table("babyLogs")->where('babyId',$id)->get();
        
        if(count($logs) > 0){
            foreach ($logs as $log) {
                $log->delete(); 
            }

        }

        $baby->delete();    

    } 

    return Redirect::to($_SERVER['HTTP_REFERER']) ->with('success', $oldBaby->babyName . ' + (' . count($logs) . ') removed!');

}

我是不是做错了什么?

如果我取出 $baby,我似乎明白了

{#501 ▼
  +"id": 93
  +"status": 0
  +"uuid": "28753a43-2c30-4ce0-b4db-b177a8d6ae3c"
  +"name": "John Doe"
  +"email": "jdoe@gg.com"
  +"password": "$2y$10$oIq.SwurET3JBLuXgSJwLOUAZADQTjOTcnPKijV1EmUNBnsreoLvm"
  +"phone": ""
  +"address": ""
  +"babyName": "tyty"
  +"babyDob": "2021-04-18"
  +"verifyCode": "EnQoq8cheWGL4a37wyhtaK6fevJRZGLHoCyZ&t=1618743364"
  +"babyProfilePath": "https://i.imgur.com/DF8G7HS.png"
  +"babyBgPath": null
  +"adminCode": "x895Gq"
  +"readOnlyCode": "Z1EVdd"
  +"created_at": "2021-04-18 07:56:04"
  +"updated_at": "2021-04-18 07:56:04"
  +"feedingInterval": 2
  +"displayMode": 2
  +"imgUrAlbumId": null
}

【问题讨论】:

  • 要么这条线不起作用$baby = DB::connection('babies')->table("babySettings")->find($id);,要么它返回的不是你想的那样
  • 我向你展示了它的 dd 结果。看起来还可以吗?
  • @RiggsFolly DB 返回一个 stdClass 的集合,它没有可用的删除方法。
  • @MateusJunges 是的,我是这么认为的,但是几年没有使用 Laravel,我只是概括了我的评论

标签: php mysql laravel laravel-8


【解决方案1】:

当您使用 DB 时,它会返回 sstdClass 对象的集合。

删除功能不适用于 stdClass 对象。您可以使用 DB 删除您的记录:

$logs = DB::connection('babies')->table("babyLogs")->where('babyId',$id)->get();

foreach ($logs as $log) {
    DB::connection('babies')->table('babyLogs')->where('id', $log->id)->delete();
}

或者,您可以一次查询全部删除:

DB::connection('babies')->table("babyLogs")->where('babyId',$id)->delete();

baby 也是stdClass,因此,您必须使用查询生成器或 eloquent 将其删除:

DB::connection('babies')->table("babySettings")->where('id', $id)->delete();

【讨论】:

  • babyLog不是问题,baby才是问题。 :)
  • 但是当我看到你的答案时,我知道问题在哪里。
  • 删除宝贝还需要使用DB。我将其添加到答案中。
【解决方案2】:

您没有通过使用 DB::table 方法获取记录来使用 Eloquent ORM。您正在获取的记录只是一个标准对象,因此它没有可用于删除的方法。

您可以使用 Eloquent 通过将记录绑定到模型来以更结构化的方式获取记录,或者您可以使用 DB 助手(查询生成器)以与获取记录相同的方式删除记录。

https://laravel.com/docs/8.x/queries#delete-statements

【讨论】:

  • 我知道如何 delete() ,但这种情况很少见。
  • 为什么这种情况很少见?您正在对没有方法的 stdClass 对象调用 delete。
猜你喜欢
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2018-02-09
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多