nik*_*aft 4 laravel eloquent laravel-5
是否有人在Laravel中具有执行多态关系的经验?我需要为几个不同的模型提供一个设置表,这里的多态关系会很好,我想知道性能,就像每个模型都有自己的设置表一样好吗?
设置表很简单,这就是设置表的样子:
$table->increments('id');
$table->integer('foreign_id')->unsigned();
$table->string('key');
$table->string('value')->nullable();
我会剃光每个模型设置所需的几个表,只是想知道使用多态设置是否会出现性能问题?
如果我决定使用多态,则将这些类型添加到表中:
        $table->string('has_settings_type');
        $table->biginteger('has_settings_id')->unsigned();
这就是laravel需要添加对多态关系的支持。
只要将正确的索引添加到表中,多态关系的性能就不会成为问题。
但是,您的表缺少使它变为多态的字段,因此需要与该设置相关的模型名称。
$table->increments('id');
$table->integer('foreign_id')->unsigned();
$table->string('foreign_object');                       // Object name (e.g.: 'App\User')
$table->string('key');
$table->string('value')->nullable();
$table->index(['foreign_id', 'foreign_object']);        // To get all settings for an object
$table->index(['foreign_id', 'foreign_object', 'key']); // To get single key for an object
小智 5
对 Jerodev 答案的改进。 索引顺序很重要。
通常你会想要搜索这样的东西
get all settings for a given model (foreign_object)
如果你保持像这样的索引顺序(foreign_id,foreign_object),那么sql将无法使用索引来执行上面的查询,因为索引中最左边的列不是foreign_object
因此索引应该像这样
$table->index(['foreign_object', 'foreign_id']);
$table->index(['foreign_object', 'foreign_id', 'key']);