在laravel视图内操作

时间:2015-02-06 20:15:17

标签: php sql laravel laravel-4 eloquent

这是我的控制器,我正在从博客模型中获取博客详细信息并通过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

还建议我是否应该在视图中或在控制器本身中执行这些过程

更新:

以下是我在图像中的表格结构,以便快速轻松地理解

enter image description here

这是我的代码:

路线:

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>

2 个答案:

答案 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 }}