【问题标题】:Get Result of Stored Procedure Laravel获取存储过程 Laravel 的结果
【发布时间】:2017-08-01 22:08:36
【问题描述】:

我正在使用 Laravel 5.4 和 MySql 5.7、PHP 5.6。 我正在尝试调用存储过程(执行 SELECT 查询,连接多个表),并将结果返回到我的 PHP。

以下是我尝试失败的事情:

PHP 1:

$result =  DB::select('CALL rentalsAvailables_get(?, ?, ?, ?)',
                array(
                    'p0' => Carbon::now(),
                    'p1' => Carbon::now()->addDays(7),
                    'p2' => 100,
                    'p3' => 2
                )
    );
return var_dump($result);

结果一:

{
   "error": {
        "message": "SQLSTATE[HY000]: General error: 2031  (SQL: CALL rentalsAvailables_get(2017-03-11 16:00:42, 2017-03-18 16:00:42, 100, 2))",
        "code": "HY000",
        "status_code": 500
   }
}

PHP 2:

$result =  DB::select('CALL rentalsAvailables_get(:p0, :p1, :p2, :p3)',
                array(
                    'p0' => Carbon::now(),
                    'p1' => Carbon::now()->addDays(7),
                    'p2' => 100,
                    'p3' => 2
                )
    );
return var_dump($result);

结果 2:

array(0) {
}

** 存储过程:**

    DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `rentalsAvailables_get`(IN `startDate` DATETIME, IN `endDate` DATETIME, IN `maxPrice` INT(11) ZEROFILL, IN `capacity` INT(2))
    NO SQL
SELECT a.rentalId, a.rentalName, a.rentalBathroom, a.rentalBedroom, a.rentalCapacity, a.rentalCover, a.rentalLat, a.rentalLong, a.rentalLocation, a.rentalStatus, a.rentalSummary, a.rentalText, a.rentalOwnerId,
b.rentalTypeId, b.rentalTypeName,
c.id as 'userId', c.name,
d.rentalPriceId, d.rentalPrice

FROM rentals as a
INNER JOIN rentalTypes as b
ON a.rentalTypeId = b.rentalTypeId
INNER JOIN users as c
ON a.rentalOwnerId = c.id
INNER JOIN rentalprice as d
ON a.rentalId = d.rentalId

WHERE a.rentalCapacity > @p3
AND a.rentalStatus = true
AND d.rentalPrice < @p2
AND d.rentalPriceStartDate <= @p0
AND d.rentalPriceEndDate >= @p1
AND a.rentalId NOT IN (
        SELECT eSub.rentalId FROM unavailabilities as eSub WHERE eSub.unavailabilityStartDate >= @p0 AND eSub.unavailabilityEndDate <= @p1
    )
AND a.rentalId NOT IN (
        SELECT fSub.rentalId FROM rent as fSub WHERE fSub.rentStartDate >= @p0 AND fSub.rentEndDate <= @p1
    )$$
DELIMITER ;

注意:

我当然已经检查过了,当这样调用它时,我会从查询中得到结果:

SET @p0='2017-03-11 04:26:09.000000';
SET @p1='2017-03-17 04:26:09.000000';
SET @p2='1000';
SET @p3='2';
CALL `rentalsAvailables_get`(@p0, @p1, @p2, @p3);

有人遇到过这个问题吗? 感谢阅读

【问题讨论】:

  • 您确定需要程序吗?
  • 我可以使用 Laravel 构建查询,但我希望将复杂的查询保留在我的数据库中
  • 目标是完全避免复杂的查询。
  • 不要误会我的意思,我不是在谈论一个疯狂的查询,只是加入 3 个表并进行一些过滤
  • 没问题。我自己很好奇。但是你只是让你的代码在未来更容易维护。

标签: php mysql laravel stored-procedures laravel-5


【解决方案1】:

你看到这两个值

2017-03-11 16:00:42, 2017-03-18 16:00:42//they are not escaped that's your problem

解决方案-

$result =  \DB::statement('CALL rentalsAvailables_get(\'' . Carbon::now() . '\', \'' . Carbon::now()->addDays(7) . '\', 100, 2)')->fetchAll();

【讨论】:

  • 至少我没有收到任何错误:) 但现在我得到“bool(true)”作为响应
  • @ThibaudLacan 没有看到你的存储过程我无话可说
  • 我已经尝试过了,但出现错误:“在布尔值上调用成员函数 fetchAll()”我还用我的存储过程更新了我的问题。感谢您的帮助!
  • @ThibaudLacan 你必须发布你的存储过程然后
  • @ARIF MAHMUD RANA 也许你可以帮助我。看看这个:stackoverflow.com/questions/51838922/…
【解决方案2】:
$result =  DB::select('CALL rentalsAvailables_get(?, ?, ?, ?)',
            array(
                'p0' => Carbon::now(),
                'p1' => Carbon::now()->addDays(7),
                'p2' => 100,
                'p3' => 2
            )
);

以上是按索引绑定参数 => 只需要像下面这样就足够了

$result =  DB::select('CALL rentalsAvailables_get(?, ?, ?, ?)',
            array(
                Carbon::now(),
                Carbon::now()->addDays(7),
                100,
                2
            )
);

请阅读有关 PHP PDO 的更多信息

【讨论】:

    【解决方案3】:

    您应该通过DB::raw 将CALL your_procedure 传递给DB::SELECT。

    所以这将起作用并返回结果集:

    $p0 = Carbon::now();
    $p1 = Carbon::now()->addDays(7);
    $p2 = 100;
    $p3 = 2;
    DB::select(DB::raw("CALL rentalsAvailables_get($p0, $p1, $p2, $p3)"));
    

    您还可以使用hydrate 方法将结果集转换为Eloquent 模型。

    Foo::hydrate($result_from_db_select);
    

    希望这对您在 6 个月后有所帮助 :))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      相关资源
      最近更新 更多