如何从 Laravel 执行存储过程

问题描述 投票:0回答:14

我需要在表单提交数据后执行存储过程。我让存储过程按照我想要的方式工作,并且我的表单正常工作。我只是不知道从 laravel 5 执行 sp 的语句。

应该是这样的:执行my_stored_procedure。但我似乎在网上找不到类似的东西。

php sql-server laravel stored-procedures laravel-5
14个回答
64
投票

尝试这样的事情

DB::select('exec my_stored_procedure("Param1", "param2",..)');

DB::select('exec my_stored_procedure(?,?,..)',array($Param1,$param2));

尝试不带参数的情况

DB::select('EXEC my_stored_procedure')

22
投票

你也可以这样做:

DB::select("CALL my_stored_procedure()");

8
投票

适用于 Laravel 5.4


DB::select(DB::raw("exec my_stored_procedure"));

如果要传递参数:

DB::select(DB::raw("exec my_stored_procedure :Param1, :Param2"),[
    ':Param1' => $param_1,
    ':Param2' => $param_2,
]);

7
投票

适用于 Laravel 5.5

DB::select('call myStoredProcedure("p1", "p2")');

DB::select('call myStoredProcedure(?,?)',array($p1,$p2));

无参数

DB::select('call myStoredProcedure()')

4
投票

使用 PHP Laravel 框架运行 Microsoft SQL Server 存储过程 (MS SQL Server)。 如果您尝试使用 Laravel Model 运行 SP,那么您可以使用以下两种方法。

$submit = DB::select(" EXEC ReturnIdExample ?,?", array( $paramOne ,$paramTwo ) ); 

$submit = DB::select(" EXEC ReturnIdExample $paramOne,$paramTwo ");

如果您要传递 Varchar 参数,请使用以下命令:

$submit = DB::select(" EXEC ReturnIdExample '$paramOne', '$paramTwo' ");

如果您只是传递 INT 或 BIGINT 参数,那么这应该可以工作,您可以从 SP 获得返回:

$submit = DB::select(" EXEC ReturnIdExample $paramOne,$paramTwo ");

执行存储过程后,值将以数组的形式出现在

$submit
中,您需要循环遍历它并访问所需的列。

foreach($submit  as $row)
{

echo $row->COLUMN1;
echo $row->COLUMN2;
echo $row->COLUMN3;

}

2
投票

对于 5.5 版本,请使用

CALL
:

return DB::select(DB::raw('call store_procedure_function(?)', [$parameter]))

2
投票

经过长期研究,这有效:

DB::connection("sqlsrv")->statement('exec Pro_Internal_Transfer_Note_post @mvoucherid='.$VMID);

1
投票
app('db')->getPdo()->exec('exec my_stored_procedure');

1
投票

Laraval 5.6 的工作代码,

DB::select('EXEC my_stored_procedure ?,?,?',['var1','var2','var3']);

1
投票

如果您的存储过程总是返回一些内容,那么您可以使用

DB::select("exec StoredProcedure '1','A','PARAM');

否则(如果SP没有响应)将会抛出异常。在这种情况下,我建议使用

DB::statetment("exec StoredProcedure '1','A','PARAM'");

1
投票

MySql 与 Laravel

5.6
(或以上版本可能是)

DB::select(
    'call sp($id)'
);

0
投票
# Real world from my Aplicaction Example Use

$result = DB::connection("sqlsrv")->statement("exec p_SaveOrderWithRelation  @cOrderID='{$order->id}', @cPaymentID='{$payment->id}', @cShiftID='{$shift->id}', @cSimple=0");
return $result;

# My PrimaryKey in Models is string type like, and i must put parametr ID like string type:

namespace App\Traits;
use Ramsey\Uuid\Uuid;
use Illuminate\Support\Str;

trait Uuids
{
    /**
     * Boot function from Laravel.
     */
    protected static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
            if (empty($model->{$model->getKeyName()})) {
                $model->{$model->getKeyName()} = Str::upper(Uuid::uuid4()->toString()); 
            }
        });
    }
    /**
     * Get the value indicating whether the IDs are incrementing.
     *
     * @return bool
     */
    public function getIncrementing()
    {
        return false;
    }
    /**
     * Get the auto-incrementing key type.
     *
     * @return string
     */
    public function getKeyType()
    {
        return 'string';
    }
}

0
投票

对于从过程中获取多个语句,请遵循以下代码:

$conn = DB::connection('sqlsrv');
    $sql = "exec [sp_name]";

    $pdo = $conn->getPdo()->prepare($sql);
    $pdo->execute();

    $res = array();
    do {
        array_push($res, $pdo->fetchAll());
       } while ($pdo->nextRowset());

    echo "<pre />";
    print_r($res);
    exit();

0
投票

我正在使用 Laravel v11.15.0 (PHP v8.3.9),我想在远程服务器上执行存储过程。我知道与远程服务器的连接有效,因为我通过调用数据库的名称进行了尝试(在代码中进行翻译和注释):

Route::get('/list-databases', function () { 尝试 { // 查询检索具有特定连接的服务器上所有数据库的名称 $databases = DB::connection('sqlsrv_external')->select('从 sys.databases 中选择名称,其中名称不在 ('master', 'tempdb', 'model', 'msdb');');

    // Returning the results as JSON
    return response()->json([
        'success' => true,
        'databases' => $databases,
    ]);
} catch (\Exception $e) {
    // Handling connection errors
    return response()->json([
        'success' => false,
        'error' => $e->getMessage(),
    ], Response::HTTP_INTERNAL_SERVER_ERROR);
}

});

我的问题是如何使用“DB::connection('sqlsrv_external')->select.......”执行对此远程服务器的查询?

这是我的配置,需要在远程服务器上执行存储过程并写入本地(Laravel 数据库所在的位置,结果)

<?php

namespace App\Http\Controllers;

use Illuminate\Console\Command;
use Illuminate\Http\Request;
use App\Models\Payment; // I assume you are using the Payment model
use Illuminate\Support\Facades\DB;

use Log;

class SyncPaymentsController extends Controller
{
    public function index()
    {
        Log::info('Starting the synchronization process.');

        try {
            $results = $this->syncPayments();
            Log::info('Synchronization completed successfully.');

            // Passing the results to the view to be displayed to the user
            return view('sync-payments', ['status' => 'completed', 'results' => $results]);
        } catch (\Exception $e) {
            Log::error('SQL Query Failed', ['error' => $e->getMessage()]);

            return view('sync-payments', ['status' => 'failed', 'error' => $e->getMessage()]);
        }
    }

    private function syncPayments()
    {
        $fromDocDate = '2023-01-01 00:01:00';
        $toDocDate = '2024-07-09 00:00:00';

        try {
            $sql = "SET NOCOUNT ON; EXEC dbo.DOCUMENT_PAYMENT_WITH_PAYMENTDATE_PROFORMA_LARAVEL @fromDocDate = '2023-01-01 00:01:00', @toDocDate = '2024-07-09 00:00:00'";
            $results = DB::select($sql, [$fromDoc

© www.soinside.com 2019 - 2024. All rights reserved.