我有两个模型(“Films”和“Tags”)以多对多关系相关。 因此,我有三个表:“films”、“tags”和“film_tag” 编辑: 我有如下的 ownToMany 关系:
电影.php
public function tags()
{
return $this->belongsToMany('App\Tag', 'film_tag');
}
标签.php
public function films()
{
return $this->belongsToMany('App\Film');
}
我想获取所有带有标签的电影的列表。我传递变量“$tag”,其中包含标签的slug。
在我的数据库中我有这个
Table TAGS:
id Tag
1 BEST
餐桌电影:
id Film
1 Fantomas
2 Minions
表 FILM_TAG
id Film_id Tag_id
1 1 1
2 2 1
因此,一个标签分配给两部电影。
1- 使用 Laravel Eloquent 我这样做了:
if (isset($tag)) {
$all_element = Film::whereHas('tags', function ($query) {
$query->where('tag', $tag);
})
->get();
}
但是我收到以下错误消息:
未定义变量:标签
问题:
2-使用普通的 Laravel 查询和数据库我这样做了:
if (isset($tag)) {
$all_element = DB::table('films')
->join('film_tag', 'film_tag.film_id', '=', 'films.id')
->join('tags', 'tags.id', '=', 'film_tag.tag_id')
->select('films.*')
->where('tags.slug', '=', $tag)
->get();
}
在这种情况下,我只得到第一部电影重复这种关系存在的次数。在这种情况下,“Fantomas”两次。如果我有十部相关电影,我会让第一部电影重复十次。
另一方面,这个变体不返回集合,因此很难操纵结果(因为所有方法都是为了处理对象集合而构建的)
3-我做了第三种解决方案,得到了正确的解决方案:获取所有电影,然后 foreach
$all_element = Film::get();
if (isset($tag)) {
$element_paused = array();
foreach ($all_element as $element) {
if (count($element->tags) > 0) {
foreach ($element->tags as $gat) {
if ($gat->slug === $tag) {
array_push($element_paused, $element);
}
}
}
}
$all_element = $element_paused;
}
但这是一个非常慢的解决方案,因为我的数据库中有超过 700 部电影
我想实施第一种方法,这种方法非常快,但我总是得到重复的电影。 任何发现错误的帮助将不胜感激
当您使用
belongsToMany
关系时,这是获取所有电影的最佳方法。
if (isset($tag)) {
$all_element = Film::whereHas('tags', function ($query) use($tag) {
$query->where('slug', $tag);
})
->get();
}
看看您缺少
use($tag)
部分,从而得到 undefined variable: tag
错误。
但是我收到以下错误消息:
未定义变量:标签
您应该将
$tag
传递给查询函数
if (isset($tag)) {
$all_element = Film::whereHas('tags', function ($query) use($tag) {
$query->where('tag', $tag);
})
->get();
}
你可以用这种方式尝试一下,然后让我知道你得到了什么
$films=Film::with('tags') ->get() ;
foreach ($films as $film)
{
$film->tags->first()->Tag;
}