我是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
我的数据库如下所示:
答案 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}}