2017-03-11 122 views
1

我使用的是Laravel 5.4和MySql 5.7,PHP 5.6。 我想調用一個存儲過程(做一個SELECT查詢,加入多個表),並將結果返回給我的PHP。獲取存儲過程的結果Laravel

這裏是我試過失敗的事情:

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); 

結果1:

{ 
    "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); 

有沒有人已經有這個問題? 感謝您閱讀

+0

你確定你需要的程序後? –

+0

我可以使用Laravel構建查詢,但是我希望將複雜查詢保留在我的數據庫中 –

+0

目標是完全避免複雜的查詢。 –

回答

1

您應通過CALL your_procedure通過DB::rawDB::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方法口才模式

Foo::hydrate($result_from_db_select); 

希望這有助於你6個月:))

0

你看這兩個值

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(); 
+0

至少我沒有得到任何錯誤:) 但現在我得到「布爾(真)」作爲迴應 –

+0

@ThibaudLacan沒有看到你的存儲過程我不能說任何東西 –

+0

@ThibaudLacan更新的問題,請檢查 –

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

以上是綁定PARAM通過指數 =>只需要像下面是足夠

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

請閱讀更多關於PHP PDO