2017-01-10 4 views
2

Я работаю над laravel 4.1. Я хочу создать функцию MYSQL с миграцией, но она не работает с php artisan migrate. даже если он показывает Migrated: 2017_01_10_140002_create_MYSQL_UNAVAILABLE_PRODS_FUNCTION в консоли. и когда я копирую/миную один и тот же код создания в MYQL-клиенте, он работает и создается функция. и когда я запустил php artisan migrate:rollback, функция будет удалена.
Любая помощь будет оценена по достоинству.Создание MYSQL FUNCTION в Laravel 4 Миграции

миграция файл:

<?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

Почему вы не используете Красноречивый? – Buglinjo

+0

У меня есть поле, называемое информацией в БД, с данными в этой форме ** config_id1 = prod_id1 | config_id2 = prod_id2 | ... ** поэтому вместо того, чтобы использовать php для выполнения некоторого теста, отправив список сотен идентификаторов .. для производительности важно, чтобы это делалось на стороне MYSQL. и мне нужно проверить, имеет ли это поле значение пары key = value из списка значений, например: 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

Я понял, в чем проблема, это разделители. Работал после того, как я снял листы DELIMITER $$, $$ и DELIMITER ;