私は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;');
}
}
なぜEloquentを使用していないのですか? – Buglinjo
私はそのフォームのデータを持つ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 ...) '': –