如何在 Laravel DB::insert 中返回我的 OUTPUT 子句

Posted

技术标签:

【中文标题】如何在 Laravel DB::insert 中返回我的 OUTPUT 子句【英文标题】:How do I return my OUTPUT clause in Laravel DB::insert 【发布时间】:2018-06-27 18:07:31 【问题描述】:

我正在使用 Laravel 和 sqlsrv,连接到 SQL Server 2016,一切正常,直到我尝试在插入查询中使用输出子句。

查询类似于

INSERT INTO TABLE(Columns) OUTPUT INSERTED.MyDesiredReturnColumn VALUES(Value)

这在 SQL Server 中完美运行,并返回所需的值,但使用 Laravel 的 DB::insert 功能它只返回 1(成功插入)

我有一个我现在不希望有的解决方法,使用 CreatedOn 字段返回最近创建的行,但这有潜在的问题。

更新:我试图检索的字段是在 SQL 中创建的唯一标识符字段(guid),而不是来自 Laravel 端

在尝试@PrathameshPalav 建议使用 Eloquent 模型创建后,值被正确插入到数据库中,但它仍然没有返回唯一标识符。

$inserted = MyModel::create($information);
print "inserted id is " . $inserted->MyModelId;

这是打印“插入的 id is”

这是我的模型:

namespace App;
use Illuminate\Database\Eloquent\Model;    
class MyModel extends Model

    //
    protected $table = 'MyModelBase';
    protected $primaryKey = 'MyModelId';
    public $incrementing = false;
    protected $keyType = "string";
    public $timestamps = false;
    protected $fillable = ['field1', 'field2', 'etc'];

任何想法都会很有帮助。

【问题讨论】:

【参考方案1】:

您可以为此目的使用 Eloquent ORM:

$insertedObject = ModelName::create($input_array);

它将返回插入的模型对象作为响应。或者,如果您只想插入记录 ID,则使用

DB::table($tablename)->insertGetId($input_array);

【讨论】:

我将尝试 Eloquent 进程。谢谢你。至于 insertGetId,我的理解是 insertGetId 仅在它是自动递增值而不是唯一标识符(guid)时才有效。我错了吗? @VulgarCoder 是的,你是对的。 insertGetId 仅适用于自动增量值。 好的,所以我创建了我的 eloquent 模型并执行了 MyModelName::create,它成功了。但是,访问 PrimaryGuidId 的值仍然返回空白。 输出对象是什么?记录是否保存在数据库中? 是的,该记录已正确保存在数据库中,当打印(或转储)插入的对象时,它会显示我通过它的所有内容,但不包括从数据库创建的唯一标识符。 【参考方案2】:

是的,当您使用 insert 时,它会返回一个布尔值。您可以使用 insertGetId 来获取 id。

如果表有自增id,使用insertGetId方法 插入一条记录然后检索 ID:

$data = [....]; // data that will be inserted
$id = DB::table('xxx')->insertGetId($data); 

更多信息: https://laravel.com/docs/5.5/queries#inserts

【讨论】:

【参考方案3】:

我解决这个问题的方法是合并一个 Eloquent 模型(正如@PrathameshPalav 指出的那样),然后(松散地)遵循本教程https://danielkoch.work/log/laravels-eloquent-guids.html

特别是这部分

public static function boot() 
    parent::boot();

    // Hook when a model is created
    static::creating(function ($model) 
        // Select a new ID
        $result = DB::select( DB::raw('Select NewID() NewUUID') );

        $model->$model->getKeyName() = $result[0]->NewUUID;
    );

之后,我将我定义的主键添加到$fillable 数组中并测试,它可以工作 =)

感谢两位的帮助!

【讨论】:

以上是关于如何在 Laravel DB::insert 中返回我的 OUTPUT 子句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel DB::insert 中返回我的 OUTPUT 子句

试图在资源 Laravel 中返​​回数据透视表

在 Laravel 中返​​回多对多关系的统一 JSON

Laravel DB::insert() 和 DB::table()->insert() 的区别

使用邮递员的 PUT/PATCH 请求在 Laravel 中返​​回状态码 0

通过 Ajax 调用将数组发送到控制器,然后控制器在 Laravel 中返​​回具有该数组的另一个视图