这是我的控制器,我正在从博客模型中获取博客详细信息并通过BlogData传递
这是控制器
$BlogData = Blog::where('BlogUrl', $data)->get();
return View::make('blogview')->with('BlogData', $BlogData);
在视图中
@foreach ($Blogs as $Blog)
{{ $Blog->BlogTitle }}
{{ $Blog->BlogTag }}
@endforeach
问题是我有BlogTag coloumn为1,3,4
,这意味着它包括第一,第二和第三标记
如何从标记模型中获取标记的标题
注意:请注意Tag::
是标记的模型,TagName是标记的名称,例如Chrome, Google, Internet
还建议我是否应该在视图中或在控制器本身中执行这些过程
以下是我在图像中的表格结构,以便快速轻松地理解
这是我的代码:
路线:
Route::get('blog', 'HomeController@Blog');
控制器:
public function BlogView($data=NULL)
{
$BlogData = Blog::with('tags')->where('BlogUrl', $data)->get();
Blog::with('tags')->where('BlogUrl', $data)->get();
return View::make('blogview')->with('BlogData', $BlogData);
}
型号:
博客模型:
<?php
class Blog extends Eloquent
{
protected $table = 'blog';
public function tags(){
return $this->belongsToMany('Tag', 'blog_tag', 'blog_id', 'tag_id');
}
}
标签型号:
<?php
class Tag extends Eloquent
{
protected $table = 'tags';
public function tags(){
return $this->belongsToMany('Tag', 'blog_tag', 'blog_id', 'tag_id');
}
}
我多次更改了视图,作为评论的效果
所以我在这里发布视图代码
观点:
<div class="jumbotron">
@foreach ($Blogs as $Blog)
<div class="well">
<p>
<a href="<?php echo url();?>/blog/<?php echo $Blog->BlogUrl;?>">{{ $Blog->BlogTitle }}</a>
{{ $Blog->tags()->toSql() }}
@foreach($Blog->tags as $tag)
{{ $tag->tags }}
@endforeach
{{ dd($Blog->tags->toJson()) }}
</p>
<div><h4>
Writted on {{ date_format($Blog->created_at, 'F d o') }} | Tagged {{$Blog->Name}}
</h4>
</div>
</div>
@endforeach
</div>
答案 0 :(得分:0)
我强烈建议您将标签存储在数据透视表中,而不是以逗号分隔的ID列表存储。这个新表看起来有点像这样:
blog_tags
----------
id (primary key)
blog_id (foreign key referencing blog table)
tag_id (foreign key referencing tag table)
现在你要继续定义博客和标签之间的关系:
class Blog extends Eloquent {
public function tags(){
return $this->belongsToMany('Tag');
}
}
根据您是否遵循Laravel的命名约定,您可能需要指定数据透视表名称和外键。这将是完全指定的关系:
return $this->belongsToMany('Tag', 'blog_tags', 'blog_id', 'tag_id');
之后,您可以通过执行以下操作来访问标记:
$Blog->tags
这将为您提供标签模型的集合。然后你可以循环它们:
@foreach($Blog->tags as $tag)
{{ $tag->name }}
@endforeach
我建议您使用with()
急切加载关系。因此,您不要为每个博客运行数据库查询来获取它的标记:
$BlogData = Blog::with('tags')->where('BlogUrl', $data)->get();
return View::make('blogview')->with('BlogData', $BlogData);
请务必查看有关Eloquent的文档中的relationship部分。
现在我明白了问题所在。首先,你不需要那条线:(虽然不是问题)
$BlogData = Blog::with('tags')->where('BlogUrl', $data)->get();
// Blog::with('tags')->where('BlogUrl', $data)->get(); <<-- remove that
return View::make('blogview')->with('BlogData', $BlogData);
然后,在tags()
模型本身中定义关系Tag
并没有多大意义。你更喜欢反向关系:
class Tag extends Eloquent
{
protected $table = 'tags';
public function blogs(){
return $this->belongsToMany('Blog', 'blog_tag', 'tag_id', 'blog_id');
}
}
然而,这也不是问题的根源。但这是:
@foreach($Blog->tags as $tag)
{{ $tag->tags }}
@endforeach
您应该访问标记的tags
并打印出来,而不是Name
:
@foreach($Blog->tags as $tag)
{{ $tag->Name }}
@endforeach
答案 1 :(得分:-1)
在这里,您可以将任何逻辑放入控制器中。只要加载with()
,就可以放入视图中。
试试这个......
{{ $Blog->BlogTag->title }}