使用Laravel通过与pivot链接的表搜索数据库

时间:2016-06-07 16:09:10

标签: php mysql database laravel eloquent

我正在尝试在我的数据库中搜索具有特定mediaattributes的所有tags元素。查询非常复杂,因为它目前执行以下操作:

  • Media表中搜索Hash,如果它与MD5哈希的正则表达式匹配。
  • 使用Attributes搜索与Media相关联的Name,称为DescriptionSourceWHERE LIKE,并且对搜索查询中的每个单词执行OR LIKE,使用正则表达式/\s+/进行拆分。
  • 搜索Tags,使用Description检查LIKE中的完整搜索字符串,然后使用完整搜索字符串检查NameSlug个别的话。

目前,我正在使用一大块PHP将整个查询拼凑在一起然后使用DB::raw,并且不能正常工作。由于我没有正确使用它,因此我认为它不相关,但我没有包括在内,但如果需要,我会包含它。

这实际上是否可以使用Laravel Eloquent或Fluent?我咬的比我现实中可以咀嚼的还要多吗?

这种搜索程度真的有必要吗?有没有更好的方法来查找具有特定标题,描述,来源和标签的项目?

谢谢。

我的Media表:

  • ID
  • 哈希

我的Attributes表:

  • ID
  • 名称
  • Media_ID

我的Tags表:

  • ID
  • 名称
  • 蛞蝓
  • 描述

我的Tag_Media表:

  • Media_ID
  • TAG_ID

1 个答案:

答案 0 :(得分:0)

使用您的查询连接四个表并且连接是最慢的SQL操作,如果可以的话,您可能希望将所有这些表合并到一个更大的列中,并且已经存在所有列。 你会在重复输入时浪费内存,但通常可以提高查询性能。

DB架构的一种可能替代方案,包含2个表(无重复项):

我的媒体表:

  • ID
  • 哈希
  • 名称
  • 描述
  • 来源

我的标签表:

  • ID
  • 姓名
  • Slug
  • 说明
  • Media_ID

数据库架构的一种可能替代方案,包含1个表(对于每个媒体,您需要具有相同媒体值和不同标记值的重复条目):

我的媒体表:

  • ID
  • 哈希
  • 名称
  • 描述
  • 来源
  • Tag_Name
  • Tag_Slug
  • Tag_Description

还尝试索引您需要搜索的列。 对于这种情况,这可能是太重武器,但非关系数据库可能会给你更好的表现。