(Laravel4)试图打印出标签

时间:2014-06-19 20:03:53

标签: laravel many-to-many

我是laravel和php的新手,我很难理解'人际关系'。

我正在尝试为我的数据库中的每个教程添加标签(可能只是被视为帖子)。

当我尝试打印1个教程的所有标签时,我只得到一个标签,而我有2个标签。

控制器:

public function index()
{
    $tags = Tutorial::where('id', '=', 1)->first()->tags()->get();
    //$tags = $tutorial->tags()->get();


    return View::make('home', array(
        'tags' => $tags
    ));
}

教程模型:

class Tutorial extends Eloquent {
    protected $table = 'tutorials';

    public function tags() {
        return $this->belongsToMany('Tag', 'tutorials_tags', 'tag_id');
    }
}

标签模型:

class Tag extends Eloquent {
    protected $table = 'tags';
    public function Tutorials() {
        return $this->belongsToMany('Tutorial', 'tutorials_tags', 'tutorial_id');
    }
}

查看:

@foreach($tags as $tags)
    {{$tags->name}}
@endforeach

我的数据库如下所示:

http://i.imgur.com/GIbqAGE.png

1 个答案:

答案 0 :(得分:1)

我认为你的循环导致了麻烦,你是用循环中的数组替换数组:

@foreach($tags as $tags)
    {{$tags->name}}
@endforeach

尝试将其更改为:

@foreach($tags as $tag)
    {{$tag->name}}
@endforeach

更新:另一个问题是您引用了错误的外键。

在多对多关系中,当您使用$this->belongsToMany()时,要求输入外键的第三个参数基本上是询问"数据透视表的哪一列,即。我应该与此tutorials_tags模型匹配的Tutorial表?"。当然应该是哪个  tutorial_id

如果您在教程的tag_id方法中指定了tags(),则会让Laravel认为tag_id是您的教程ID,这是错误的。 Tutorial应在数据透视表中以tutorial_id查找。

所以你的public function tags()实际上需要:

public function tags() {
    return $this->belongsToMany('Tag', 'tutorials_tags', 'tutorial_id');
}

或者作为奖励点,如果你看一下Laravel源代码,它会:

$foreignKey = $foreignKey ?: $this->getForeignKey();

getForeignKey()return snake_case(class_basename($this)).'_id';执行"tutorial_id",而public function tags() { return $this->belongsToMany('Tag', 'tutorials_tags'); } 会返回$otherKey

由于您已经符合Laravel的命名表和外键标准,因此您可以省略第三个参数:

tutorials_tags

这与Tag相同,后者询问"数据透视表的哪一列,又名。我应该与tag_id模型匹配的Tutorial表?" 所以它会是Tag

所以我们完成了Tag模型。现在,让我们应用于public function tutorials() { return $this->belongsToMany('Tutorial', 'tutorials_tags', `tag_id`); } 模型。所以在{{1}}模型应该是:

{{1}}