我可以在 Facadesdb 插入中获取主键以供直接使用 - Laravel 8

Posted

技术标签:

【中文标题】我可以在 Facadesdb 插入中获取主键以供直接使用 - Laravel 8【英文标题】:Can I get the primary key inside the facadesdb insert for direct use - Laravel 8 【发布时间】:2021-12-26 19:06:38 【问题描述】:

我正在学习 Laravel 8 并遇到了这个问题。所以,我制作了一个带有 FacadesDB 插入功能的控制器类。这是我的代码:

public function aksimenulis_laporan(Request $request)
        $filefoto = $request->foto;
        DB::table('pengaduan')->insert([
            'tgl_pengaduan' => date('Y-m-d'),
            'nik' => $_POST['nik'],
            'isi_laporan' => $_POST['isi_laporan'],
            'foto' => $filefoto->getClientOriginalName(),
            'status' => '0',
        ]);

        // isi dengan nama folder tempat kemana file diupload
        $tujuan_upload = storage_path();
 
        // upload file
        $filefoto->move($tujuan_upload,$filefoto->getClientOriginalName());
        return redirect('');    
    

https://i.stack.imgur.com/VTJyS.png 这是我的数据库表结构。

我正在尝试插入值为“id_pengaduan”或主键的“foto”,就像使用此代码一样。这将是 PrimaryKey_OriginalFileName

'foto' => $filefoto-> 'id_pengaduan'.'_'.getClientOriginalName(),

但问题是我还没有价值。有没有一种方法可以让我用表的主键为 'foto' 赋值?

【问题讨论】:

【参考方案1】:

您可以使用insertGetId方法插入一条记录,然后检索ID:

 $pengaduan_id= DB::table('pengaduan')->insertGetId([
            'tgl_pengaduan' => date('Y-m-d'),
            'nik' => $_POST['nik'],
            'isi_laporan' => $_POST['isi_laporan'],
            'status' => '0',
        ]);
   DB::table('pengaduan')->where('id',$pengaduan_id)->update(['foto'=>$filefoto->getClientOriginalName()]);

在插入操作完成之前无法获取id。

您也应该在transaction 中这样做,但现在,我会保持这种方式。

【讨论】:

谢谢大佬,这个方法我看过了。但我没想到,大声笑,我尝试使用 'foto'=>insertGetId().'_'.getClientOriginalName(), 我试过代码,它说的是未定义变量 $pengaduan_id $pengaduan_id= DB::table('pengaduan')->insertGetId([ .... 你确定在 DB::table('pengaduan')->where( 'id',$pengaduan_id)? 我忘了,经过一番搜索,最后我可以用主键名插入我用第一种方法再添加1个门面并调用主键 干得好,如果我的回答解决了问题,请将其标记为已接受,以便我们将此问题视为“已回答”【参考方案2】:

您不能(也不应该)插入一行并定义其主键。这就是主键的全部目的。你让 SQL 管理它的标识符,这样可以防止出错,所以主键中没有重复项。

由于您是 Laravel 的新手,所以我将进行 eloquent,这将使您的 DB 操作生活更轻松。

首先,您需要为您的桌子制作一个新模型。您可以使用控制台命令执行此操作:

php artisan make:model ModelName

然后,导航到您的模型目录 (app/Models/),您将找到新模型 ModelName.php

在那里,您需要指定表名和主键。您可以通过以下两行来做到这一点:

protected $table = 'pengaduan';
protected $guarded = ['id_pengaduan'];

你的模型现在应该看起来像

namespace App\Models;

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

class ModelName extends Model

    use HasFactory;

    protected $table = 'pengaduan';
    protected $guarded = ['id_pengaduan'];

保存,您可能需要清除缓存。通过在控制台中运行 php artisan optimize 来执行此操作。

将数据插入新行后,您可以获得分配给该行的主键,如下所示:

    //using eloquent
    use App\Models\ModelName;

    //insert data
    $insertRow = new Pengaduan;
    $insertRow->tgl_pengaduan = date('Y-m-d');
    $insertRow->nik = $_POST['nik'];
    $insertRow->isi_laporan= $_POST['isi_laporan'];
    $insertRow->foto = $filefoto->getClientOriginalName();
    $insertRow->status = 0;

    $insertRow->save();

    //get key here
    $rowId = $insertRow->pengaduan_id;

如果您想使用DB::table('table')->insert 方法,请参阅 OMR 的答案。


如果你真的想自己定义主键,那么你必须在表上运行这个查询:

SET IDENTITY_INSERT [Tablename] ON;

您可以阅读有关此on this thread 的更多信息。

【讨论】:

Insert Method for query builder 返回 bool 值,见:laravel.com/api/8.x/Illuminate/Database/Query/… 哦,你是对的,我只是复制并粘贴了他的代码,没有看两次,把它和雄辩的混淆了。我会更新答案。谢谢。

以上是关于我可以在 Facadesdb 插入中获取主键以供直接使用 - Laravel 8的主要内容,如果未能解决你的问题,请参考以下文章

如何使主键以特定字母开头?

可以在数据仓库维度表上存储事务主键以在事实暗淡之间关联吗?

如何从 aspx 中的 Gridview 行中检索主键以在 userControl.ascx 中使用?

设计 mySql 索引和主键以提高效率

在sqlite中插入时获取主键而不是rowID或通过其rowID获取主键

在 SQL Server CE 和 C# 中获取新插入行的主键?