我可以在 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 中使用?