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

Can I get the primary key inside the facadesdb insert for direct use - Laravel 8

我正在学习 Laravel 8 并且遇到了这个问题。因此,我制作了一个具有 FacadesDB Insert 功能的控制器 class。这是我的代码:

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 这是我的数据库 table 结构。

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

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

但是这个问题我还没有值。有没有一种方法可以用 table 的主键值 'foto'?

可以使用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 中这样做,但现在,我会保持这种方式。

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

我将进入 eloquent,因为您是在 Laravel 开始新的,这将使您的数据库操作更轻松。

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

php artisan make:model ModelName

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

在那里,您需要指定 table 名称和主键。你可以用这两行来做到这一点:

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'];
}

保存,您可能需要清除缓存。在控制台中 运行ning 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的回答。


如果您真的想要自己定义主键,那么您必须运行在table:

SET IDENTITY_INSERT [Tablename] ON;

您可以阅读更多相关内容 on this thread