您必须记住一些事情,Eloquent 关系是关系数据库关系的模型(即 MySQL)。
所以,我提出了两种方法。
好的
如果你想用数据库中的索引和外键实现功能齐全的 Eloquent 关系,你可能想动态地改变 SQL 表。
例如,假设您已经创建了所有模型并且不想动态创建它们,您只需更改 Page 表,添加一个名为“banner_id”的新字段,对其进行索引并引用“banner_id”字段在横幅表上。
然后您必须写下并支持您将使用的 RDBMS。
之后,您可能希望包括对迁移的支持。如果是这种情况,您可以将这些表更改存储在数据库中以供进一步回滚。
现在,对于 Eloquent 支持部分,您可以查看 Eloquent Model Class。
请注意,对于每种关系,您都有一个 subyacent 模型(都可以找到 here,这实际上是您在关系方法中返回的内容:
public function hasMany($related, $foreignKey = null, $localKey = null)
{
$foreignKey = $foreignKey ?: $this->getForeignKey();
$instance = new $related;
$localKey = $localKey ?: $this->getKeyName();
return new HasMany($instance->newQuery(), $this, $instance->getTable().'.'.$foreignKey, $localKey);
}
因此,您必须在模型中定义一个接受关系类型和模型的方法,创建一个新的 HasMany(如果 hasMany 是所需的关系)实例,然后返回它。
这有点复杂,所以你可以使用:
简单
您可以创建一个中间模型(即 PageRelationship)来存储 Page 和其他模型之间的所有关系。可能的表架构可能是:
+-------------+---------+------------------+-------------+
| relation_id | page_id | foreign_model_id | model_class |
+-------------+---------+------------------+-------------+
| 1 | 2 | 225 | Banner |
| 2 | 2 | 223 | Banner |
| 3 | 2 | 12 | Button |
+-------------+---------+------------------+-------------+
然后您可以检索到给定页面的所有动态相关模型。这里的问题是您实际上在模型和页面之间没有任何真正的 RDBMS 关系,因此您可能必须进行多次繁重的查询来加载相关的模型,而且更糟糕的是,您必须管理自己的数据库一致性(即,删除或更新“225”横幅也应删除或更新 page_relationship_table 中的行)。逆向关系也会很头疼。
结论
如果项目很大,这取决于它,并且您无法通过继承来实现其他模型的模型,您应该使用好的方法。否则,您应该重新考虑您的应用设计,然后决定是否选择第二种方法。