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”。