데이터베이스 작업에 Laravel을 사용할 때는 대부분 비즈니스 로직을 처리하기 위해 Eloquent ORM 또는 Query Builder를 사용하는 데 주로 사용됩니다. 그러나 여러 결과 세트를 반환하는 저장 프로 시저와 같은보다 복잡한 데이터베이스 작업에 직면하면 Next_Result () 기능이 핵심 도구가됩니다.
이 기사는 Laravel의 Next_result () 지원 방법을 캡슐화하여 특히 다중 소수 처리 시나리오에서 데이터베이스 작업의 유연성을 향상시키는 방법을 살펴 봅니다.
일부 데이터베이스 작업은 여러 결과 세트 (예 : MySQL 저장 프로 시저의 다중 선택과 같은)를 반환합니다. 이는 일부 복잡한 보고서 또는 다단계 쿼리 시나리오에서 일반적입니다. Laravel의 기본 데이터베이스 추상화 계층은 next_result () 를 직접 지원하지 않으므로 수동으로 캡슐화해야합니다.
다음 MySQL 저장 절차가 있다고 가정합니다.
DELIMITER //
CREATE PROCEDURE GetUserStats(IN userId INT)
BEGIN
SELECT * FROM users WHERE id = userId;
SELECT COUNT(*) AS post_count FROM posts WHERE user_id = userId;
END //
DELIMITER ;
이 절차를 호출하면 두 가지 결과 세트가 반환됩니다. 하나는 사용자 정보이고 다른 하나는 해당 사용자의 기사 수입니다.
여러 결과 세트를 처리하기 위해 도우미 클래스를 만들 수 있습니다.
namespace App\Support;
use Illuminate\Support\Facades\DB;
class MultiResultSet
{
protected $connection;
public function __construct()
{
$this->connection = DB::connection()->getPdo();
}
public function callProcedure(string $procedure, array $bindings = [])
{
$stmt = $this->connection->prepare("CALL {$procedure}");
$stmt->execute($bindings);
$results = [];
do {
$result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
if ($result) {
$results[] = $result;
}
} while ($stmt->nextRowset());
return $results;
}
}
이 클래스에 전화하여 다중 저렴한 세트의 반환을 처리하십시오.
use App\Support\MultiResultSet;
$multi = new MultiResultSet();
$results = $multi->callProcedure('GetUserStats(?)', [1]);
$user = $results[0][0] ?? [];
$postCount = $results[1][0]['post_count'] ?? 0;
여러 결과 세트 (예 : MySQL )를 지원하는 데이터베이스 드라이버를 사용하고 있는지 확인하십시오.
MySQL 서버가 Laravel에서 오류가 발생하지 않으면 Max_allowed_packet 및 Connection TimeOut 구성을 확인해야합니다.
이 기능을보다 다재다능하게하려면 다음을 권장합니다.
Laravel로 캡슐화 된 서비스 제공 업체 또는 외관;
로깅 및 예외 처리 추가;
반환 된 결과 (예 : DTO 또는 수집으로 변환)를 형식화하십시오.
Laravel은 기본적으로 Next_Result ()를 직접 지원하지는 않지만 기본 PDO 작업을 수동으로 캡슐화하여 다중 레지트 세트 시나리오를 여전히 우아하게 처리 할 수 있습니다. 이 방법은 복잡한 쿼리,보고 시스템 또는 레거시 시스템을 마이그레이션하는 동안 데이터베이스 상호 작용 요구 사항에 특히 적합합니다.
Laravel의 이벤트 청취, 로깅 또는 캐싱 지원 통합과 같은이 기능을 추가로 확장하려면 https://gitbox.net을 방문하여 더 많은 코드 인스턴스 및 실제 경험 공유를 보려면이 기능을 방문하십시오.