我需要在表单提交数据后执行存储过程。我让存储过程按照我想要的方式工作,并且我的表单正常工作。我只是不知道从 laravel 5 执行 sp 的语句。
应该是这样的:执行my_stored_procedure。但我似乎在网上找不到类似的东西。
尝试这样的事情
DB::select('exec my_stored_procedure("Param1", "param2",..)');
或
DB::select('exec my_stored_procedure(?,?,..)',array($Param1,$param2));
尝试不带参数的情况
DB::select('EXEC my_stored_procedure')
你也可以这样做:
DB::select("CALL my_stored_procedure()");
适用于 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,
]);
适用于 Laravel 5.5
DB::select('call myStoredProcedure("p1", "p2")');
或
DB::select('call myStoredProcedure(?,?)',array($p1,$p2));
无参数
DB::select('call myStoredProcedure()')
使用 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;
}
对于 5.5 版本,请使用
CALL
:
return DB::select(DB::raw('call store_procedure_function(?)', [$parameter]))
经过长期研究,这有效:
DB::connection("sqlsrv")->statement('exec Pro_Internal_Transfer_Note_post @mvoucherid='.$VMID);
app('db')->getPdo()->exec('exec my_stored_procedure');
Laraval 5.6 的工作代码,
DB::select('EXEC my_stored_procedure ?,?,?',['var1','var2','var3']);
如果您的存储过程总是返回一些内容,那么您可以使用
DB::select("exec StoredProcedure '1','A','PARAM');
否则(如果SP没有响应)将会抛出异常。在这种情况下,我建议使用
DB::statetment("exec StoredProcedure '1','A','PARAM'");
MySql 与 Laravel
5.6
(或以上版本可能是)
DB::select(
'call sp($id)'
);
# 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';
}
}
对于从过程中获取多个语句,请遵循以下代码:
$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();
我正在使用 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