如何在Laravel中创建多态关系;可以“;不存在


How to create a polymorphic relationship in Laravel when a relationship "may" not exist?

我有一个posts表,一个post可能有一个媒体。它可以是一个视频或画廊。这很容易,我所做的就是建立一个多态关系,它起了作用。

+----------------------------------------------------------+|岗位|+------+-----------------+---------+----------+------------+|id | title | content | media_id | media_type|+------+-----------------+---------+----------+------------+|1|太棒了…|Rea…|10|视频|+------+-----------------+---------+----------+------------+|2|酷照片…|请参阅…|12|画廊|+------+-----------------+---------+----------+------------+|3|观看…|请参阅…|22|视频|+------+-----------------+---------+----------+------------+

问题是有些帖子没有媒体,多态关系将记录连接到其类型字段中指定的模型。

+----------------------------------------------------------+|岗位|+------+-----------------+---------+----------+------------+|id | title | content | media_id | media_type|+------+-----------------+---------+----------+------------+|1|太棒了…|Rea…|10|视频|+------+-----------------+---------+----------+------------+|2|酷照片…|请参阅…|12|画廊|+------+-----------------+---------+----------+------------+|3|观看…|请参阅…|22|视频|+------+-----------------+---------+----------+------------+|4|十大游戏…|播放…|0||+------+-----------------+---------+----------+------------+|5|你想要…|Buil…|0||+------+-----------------+---------+----------+------------+

将media_type设置为空会导致错误,因为它将搜索空字符串类。建立这种关系的最佳方式是什么?我应该和他们一起去一张假桌子吗(请不要)?或者有没有合适的方法来处理这个问题?

谢谢!

我认为您的问题的最佳解决方案是划分posts表和多态关系表。例如,Your posts表只包含post信息,relation表包含post_id和relationship信息,这样您就不需要关心媒体是否存在。像这样,

+----------------------------------|
| posts                            |
+------+-----------------+---------|
| id   | title           | content |
+------+-----------------+---------|
| 1    | Some Awesome... | Rea...  |
+------+-----------------+---------|
| 2    | Cool Photos...  | See...  |
+------+-----------------+---------|
| 3    | Watch The...    | See...  |
+------+-----------------+---------|
+----------------------------------------+
| media                                  |
+------+---------+----------+------------|
| id   | post_id | media_id | media_type |
+------+---------+----------+------------|
| 1    | 1       | 10       | Video      |
+------+---------+----------+------------|
| 2    | 2       | 12       | Gallery    |
+------+---------+----------+------------|
| 3    | 3       | 22       | Video      |
+------+---------+----------+------------|

介质模型

public function medias()
{
    return $this->morphTo();
}

在Post模型中,它将与Media模型是一对一或一对多的关系(无论你喜欢什么)。

public function media()
{
    return $this->hasMany('Media');
}
OR
public function media()
{
   return $this->hasOne('Media');
}

在视频、图库模型中,它们与媒体模型具有多态性关系。

public function media()
{
return $this->morphMany('Media', 'medias');
}