[英]Laravel Eloquent increment a column based on a relation
我目前有一個與另一個模型相關聯的圖像鏈接表,如下所示
+----+-------------+----------------+
| id | property_id | url |
+----+-------------+----------------+
| 1 | 2 | /example.jpg |
| 2 | 7 | /example-2.jpg |
| 3 | 5 | /example-3.jpg |
+----+-------------+----------------+
我想在表格中添加一列來對圖像進行排序,如下所示
+----+-------------+----------------+------------+
| id | property_id | url | sort_order |
+----+-------------+----------------+------------+
| 1 | 2 | /example.jpg | 1 |
| 2 | 7 | /example-2.jpg | 1 |
| 3 | 2 | /example-3.jpg | 2 |
+----+-------------+----------------+------------+
有沒有辦法使 sort_order 值 auto_increments 但依賴於 property_id 值的數據庫級約束(即把它放在遷移中),這樣 sort_order 值本質上是一個索引,每個 property_id 都有自己的索引?
<table_name>
應替換為您的表名。
關鍵在這一行
\\DB::unprepared('CREATE TRIGGER <table_name>_sort_order BEFORE INSERT ON <table_name> FOR EACH ROW SET NEW.sort_order = (SELECT IFNULL(MAX(sort_order), 0) FROM <table_name> WHERE property_id = NEW.property_id) + 1;');
<?php
use Illuminate\Database\Migrations\Migration;
class AddSortOrderTo<table_name_camelized> extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table(<table_name>, function(Blueprint $table) {
$table->unsignedInteger('sort_order')->default(0);
});
\DB::unprepared('CREATE TRIGGER <table_name>_sort_order BEFORE INSERT ON <table_name> FOR EACH ROW SET NEW.sort_order = (SELECT IFNULL(MAX(sort_order), 0) FROM <table_name> WHERE property_id = NEW.property_id) + 1;');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
\DB::statement('DROP TRIGGER <table_name>_sort_order');
Schema::table(<table_name>, function (Blueprint $table) {
$table->dropColumn('sort_order');
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.