2017-01-10 6 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関数を作成

移行ファイル:

<?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 | ... **そのため、パフォーマンスのために何百ものIDのリストを送信して何らかのテストを行うためにphpを使用するのではなく問題は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

私は一重引用符を二重引用符に置き換えてもまだ動作しません。 これが問題だった場合は、コンソールにエラーが表示されます。 –

1

私は問題が何かを理解しました、それはデリミタです。 私はlignesを削除した後に動作しましたDELIMITER $$$$およびDELIMITER ;

関連する問題