2017-01-10 5 views
2

laravel 4.1에서 작업 중입니다. 마이 그 레이션 MYSQL 함수를 만들려는하지만 php artisan migrate 함께 작동하지 않습니다. 콘솔에 Migrated: 2017_01_10_140002_create_MYSQL_UNAVAILABLE_PRODS_FUNCTION이 표시 되더라도 마찬가지입니다. MYQL 클라이언트에서 동일한 생성 코드를 복사/지나치면 작동하고 함수가 만들어집니다. 그리고 php artisan migrate:rollback을 실행하면 함수가 제거됩니다.
도움이 될 것입니다.Laravel 4 마이그레이션에서 MYSQL FUNCTION 만들기

마이그레이션 파일 :

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateMYSQLUNAVAILABLEPRODSFUNCTION extends Migration 
{ 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     $available = Constant::PRODUCT_AVAILABLE_TRUE | Constant::PRODUCT_AVAILABLE_STOCK_TRUE; 

     $sql = 'DROP FUNCTION IF EXISTS UNAVAILABLE_PRODS; 
       DELIMITER $$ 
       CREATE FUNCTION UNAVAILABLE_PRODS(CONFIG_ID INT, PROD_TYPE INT) 
        RETURNS TEXT 
        LANGUAGE SQL 
       BEGIN 
        DECLARE RES TEXT; 

        SET GROUP_CONCAT_MAX_LEN = 2048; 

        SET RES = (SELECT GROUP_CONCAT(ID SEPARATOR \'|\') FROM PRODUCT_BASE WHERE `PRODUCT_TYPE` & PROD_TYPE AND `PRODUCT_BASE`.`AVAILABLE` <> ' . $available . '); 

        RETURN CONCAT(CONFIG_ID, \'=(\', RES, \')\'); 
       END; 
       $$ 
       DELIMITER ; 
       '; 

     DB::unprepared($sql); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     DB::unprepared('DROP FUNCTION IF EXISTS UNAVAILABLE_PRODS;'); 
    } 

} 
+0

Eloquent를 사용하지 않는 이유는 무엇입니까? – Buglinjo

+0

그 양식의 데이터와 함께 DB에있는 info라는 필드가 있습니다 ** config_id1 = prod_id1 | config_id2 = prod_id2 | ... ** 그래서 PHP를 사용하여 수백 개의 ID 목록을 보내서 성능을 테스트하는 대신 문제는 MYSQL 쪽에서하는 것이 더 낫다는 것이다. 그리고 그 필드가 값 목록에서 쌍 키 = 값이 있는지 확인해야합니다. 예 : 41 = (202 | 101 ..) : SELECT ... WHERE info REGEXP UNAVAILABLE_PRODS (41, 64)'. 함수 실행 후 결과는 다음과 같을 것입니다. SELECT ... WHERE info REGEXP '41 = (prod_id1 | prod_id2 ...) '': –

답변

0

내가 실수 여기에이 따옴표가 SQL의 외부에있는 \'|\') 생각 (녹색이 아니다). 그래서 PHP는 어떤 식 으로든 그것들을 실행하려고 시도합니다. screenshot of your code

+0

작은 따옴표를 double로 바꾸었지만 여전히 작동하지 않습니다. 그게 문제 였다면 콘솔에 오류가 나타납니다. –

1

저는 문제가 무엇인지 알아 냈습니다. 그것은 구분 기호입니다. lignes를 제거한 후에 작동했습니다. DELIMITER $$, $$DELIMITER ;