Laravel:选择条件位于另一个表中的所有电影

问题描述 投票:0回答:3

我有两个模型(“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();

    }

但是我收到以下错误消息:

未定义变量:标签

问题:

  • 如何在 Eloquent 中“加入”两个表?
  • 如何在查询函数中重新调整变量?

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 部电影

我想实施第一种方法,这种方法非常快,但我总是得到重复的电影。 任何发现错误的帮助将不胜感激

php laravel database eloquent
3个回答
1
投票

当您使用

belongsToMany
关系时,这是获取所有电影的最佳方法。

if (isset($tag)) {
    $all_element = Film::whereHas('tags', function ($query) use($tag) {
            $query->where('slug', $tag);
        })
        ->get();

}

看看您缺少

use($tag)
部分,从而得到
undefined variable: tag
错误。


0
投票

但是我收到以下错误消息:

未定义变量:标签

您应该将

$tag
传递给查询函数

if (isset($tag)) {
    $all_element = Film::whereHas('tags', function ($query) use($tag) {
            $query->where('tag', $tag);
        })
        ->get();

}

0
投票

你可以用这种方式尝试一下,然后让我知道你得到了什么

$films=Film::with('tags') ->get() ;
foreach ($films as $film)
{
$film->tags->first()->Tag;
} 
© www.soinside.com 2019 - 2024. All rights reserved.