Laravel 5.5,显示来自两个表的新闻数据

时间:2017-12-20 20:26:14

标签: sql laravel

我是laravel的新手,我遇到了一些麻烦。我尝试获取存储在两个不同表中的数据并显示它们:

News.php(模特)

      col0         col1  col2   col4
 1    '1ZE7999'  865545   20    20
 5    100        865628  292     5
 3    34         865665  296     0 
 4    56         865700  297     0
 2    'R022428'  865584  297     0

这就是我从新闻表中获取结构为:

的所有数据的方法
    public static function Data($category) {
    $perPage = config('var.news.perPage');

    if ($category) {
        $news = News::orderBy('id', 'desc')->where('category', $category)->SimplePaginate($perPage);
    } else {
        $news = News::orderBy('id', 'desc')->SimplePaginate($perPage);
    }

    return $news;
}

类别列包含以逗号分隔的值,例如1,2,3,4-

现在,我有另一张表,News_Cat,其中包含id, title, body, created_at updated_at, created_by, updated_by, category 列。

在另一种方法中,我尝试根据存储在新闻表

的类别列中的值来获取过滤器名称
id, name

然而,它完全不起作用。我试图实现的是在view.blade中显示过滤器名称为' name'来自News_Cat的指定过滤器的值

    public static function getFilterNames($id) {

    $filters = DB::table('News_Cat')
        ->select('News_Cat.name as name')
        ->leftJoin('News', DB::raw('CAST(News_Cat.id as nvarchar)'), DB::raw('ANY(SELECT(News.category))'))
        ->where('News.id', $id)
        ->get();

    return $filters;
}

因此,我会得到例如 @if($news->count()) @foreach($news as $article) <a href="{{ route('news.show', $article->id) }}" class="item angled-bg" data-filters="{{ $filters }}"> <div class="row"> 代替data-filters =&#34; 1,2,3,4&#34;&gt;

谢谢

1 个答案:

答案 0 :(得分:0)

你应该用eloquent!

在您的新闻模型中

public function getFiltersAttribute(){
       $categories = explode(',', $this->category);
       return implode(', ', NewsCat::find($categories)->pluck('name')->toArray());
}

然后在你看来:

{{ $article->filters }}

将输出news, update, hot, latest

<强> BUT

您应该在类别和新闻之间使用数据透视表,这样会更容易。 此方法不允许您急切加载关系并为每个新闻发出请求

如果您无法更改数据库结构,我建议您:

在AppServiceProvider的启动方法中:

Config::set('tags', NewsCat::all());

THEN

public function getFiltersAttribute(){
       $categories = explode(',' $this->category);
       return implode(', ', config('tags')->whereIn('id', $categories)->pluck('name')->toArray());
}

许多方法

我正在使用laravel命名约定:

news,categories_news(数据透视)和类别

您将拥有2个模型:新模型和类别

在新模型中

public function categories(){
    return $this->belongsToMany(Category::class)
}

在您的类别模型中:

public function news(){
    return $this->belongsToMany(New::class);
}

如果您没有使用laravel命名约定,则必须按照以下方式自定义这些ral tion:https://laravel.com/docs/5.5/eloquent-relationships#many-to-many