Php Laravel在mysql表上做操作的雄辩方式
我是拉威尔的新手。 我有一张桌子,上面有这样的标签:Php Laravel在mysql表上做操作的雄辩方式,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我是拉威尔的新手。 我有一张桌子,上面有这样的标签: tag | audience Tall | Anurag Nice | Anurag Tall | Kapil Nice | Simon $audienceIds = DB::table("audience_tags")->whereIn("tag", $request->tagIds)->pluck("audience"); 所以 目前,我正在这样做: tag | audience Tall | Anurag Ni
tag | audience
Tall | Anurag
Nice | Anurag
Tall | Kapil
Nice | Simon
$audienceIds = DB::table("audience_tags")->whereIn("tag", $request->tagIds)->pluck("audience");
所以
目前,我正在这样做:
tag | audience
Tall | Anurag
Nice | Anurag
Tall | Kapil
Nice | Simon
$audienceIds = DB::table("audience_tags")->whereIn("tag", $request->tagIds)->pluck("audience");
但是它返回Anurag、Kapil和Simon的['Tall'、'Nice']你将无法通过该结构逃离
组
$audiences = \DB::table("audience_tags")
->whereIn("tag", $request->tagIds)
->groupBy('audience')
->havingRaw('count(tag) = ?', count($request->tagIds))
->pluck('audience');
声明了表受众
和标记
后,您可以利用受众
和标记
模型之间的关系(假设标记id
是表标记
中的主键)
原始查询:
SELECT name
FROM my_table
WHERE tag IN('tall','nice')
GROUP
BY name
HAVING COUNT(*) = 2;
如果我查询['Tall','Nice'],它应该只返回Anurag
。为什么?它通常返回标记
为高
或好
的行。但我需要在标记和访问群体之间执行和操作。您希望将单独的行作为一行执行。但这不是mysql
的工作方式。也许你应该对表进行预处理,将其转换为(distinct)acquisition | tag[]
,然后以的形式进行查询,其中tag[]是请求的子数组->tagid
。这会让人相信你把自己的名字拼错了:-(好吧,我相信你可以通过(SELECT x.name FROM my_table x JOIN my_table y ON y.name=x.name AND y.tag='tall',其中x.tag='nice';
,但是为什么要这样做呢?在一个更好的结构中,你会有一个具有真正唯一ID的tags
表,另一个acquisitions
表包含所有可能的访问者,并在他们之间有一个透视表。查询将速度更快,不需要在非字符串字段上使用group by
。在real中,有一个用于标记的表、一个用于访问群体的表和一个透视表。为了便于理解实际问题,我在这里举了一个示例。@Anurag那么您应该使用whereHas
在访问群体
表上进行查询。这就是faster和simplerI已经尝试过这个方法,但它对动态标记集不起作用。是的,它会起作用。您只需用in()中的参数数替换“2”。