Laravel的多态关系表现

时间:2017-07-27 10:38:51

标签: laravel laravel-5 eloquent

有没有人对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需要增加对多态关系的支持。

3 个答案:

答案 0 :(得分:5)

只要您向表中添加正确的索引,性能就不会成为多态关系的问题。

但是,您的表缺少一个字段以使其具有多态性,您需要与该设置相关的模型名称。

  render() {
    let {animals} = this.state;

    return (
      <div>
      {[...animals].sort((a,b) => {return a.age - b.age}).map((animal)=>{
        return (<p key={animal.id}>{animal.type}</p>)
      })}
    </div>
    )
  }

答案 1 :(得分:1)

如果你使用的时间少于5.2.34,那么就不会过多地关注多态关系。您可以阅读有关此问题的更多信息here。一个例子是如果images是多态的,你做了:

->with('product.images.sources');

sources不会急于加载。

答案 2 :(得分:1)

对 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']);