Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Laravel的《雄辩》中找到在多对多关系中共享标签的文章的正确方法_Php_Laravel_Laravel 5_Eloquent - Fatal编程技术网

Php 在Laravel的《雄辩》中找到在多对多关系中共享标签的文章的正确方法

Php 在Laravel的《雄辩》中找到在多对多关系中共享标签的文章的正确方法,php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,我有三个表,一个articles表、一个tags表和一个中间pivot表article_tags,它只包含article_id和tag_id,形成了多对多关系 我想编写一个函数来接收一篇文章,并返回一个集合或查询,其中所有文章都与接收到的文章共享至少一个标记,在尝试了一系列不同的解决方案后,我有以下几点: public function scopeRelated($query, Article $article) { return $query->whereHas('tags',

我有三个表,一个articles表、一个tags表和一个中间pivot表article_tags,它只包含article_id和tag_id,形成了多对多关系

我想编写一个函数来接收一篇文章,并返回一个集合或查询,其中所有文章都与接收到的文章共享至少一个标记,在尝试了一系列不同的解决方案后,我有以下几点:

public function scopeRelated($query, Article $article)
{
    return $query->whereHas('tags', function ($query) use ($article) {
        // I've tried a bunch of different lines, like just $article->tags
        $query->whereIn('tags', $article->tags->pluck('id'));
    });
}
这将返回一个错误:

带有消息“SQLSTATE[42S22]”的/Database/QueryException: 找不到列:1054“where子句”SQL中的未知列“tags”: 从存在的文章中选择*从标记内部连接中选择* article\u tag on tags.id=article\u tag.tag\u id,其中 articles.id=第1,6条中的article_tag.article_id和标记, 4'

显然,Eloquent正在尝试将标记与Articles表中不存在的“tags”列相匹配。 询问我想要什么的正确方式是什么?

用“tags.id”替换“tags”列。另外,如果$article对象没有已加载的标记关系,我建议$article->tags->pull'id',因为这种方式只会查询文章id

是的,您可能希望从结果中排除$article。我假设包含项目的表称为项目

因此,查询将如下所示:

    return $query->whereHas('tags', function ($query) use ($article) {
        $query->whereIn('tags.id', $article->tags()->pluck('id'));
    })->where('articles.id', '<>', $article->id);
使用tag_id来超特定于子查询:

返回$query->whereHas'tags',函数$query use$article{ $query->其中的'tag_id',$article->tags->pull'id'; }; 另一个答案中的“id”在Laravel5.8和MySQL5.7中对我有效。可能启用了某种严格模式,或者在不需要的情况下,您的article_标记表中确实有一个id列

另外,不要忘记将原始文章从相关结果中排除!:

$query ->其中有'tags',函数$query使用$article{ $query->其中的'tag_id',$article->tags->pull'id'; } ->其中'id',$article->id;
这会产生错误:Illumb/Database/QueryException,带有消息“SQLSTATE[23000]:完整性约束冲突:字段列表中的1052列“id”不明确SQL:从标记中选择id内部连接文章\u标记on tags.id=文章\u标记.tag\u id,其中文章\u标记.article\u id=1右,它应该是'tags.id',以便mysql知道id引用哪个表。编辑了我的答案。