如何从Laravel 4.2中不同表中的类别值中查找类别名称?

时间:2015-09-07 21:50:18

标签: php mysql laravel laravel-4 laravel-5

有两种表类别和内容。 内容表有id,category_id

类别表有类别名称和ID

我必须从类别名称中获取内容表中的所有内容,该类别名称在类别表中。

我不想使用JOIN。

请建议我使用其他查询。

控制器

     $AllContent=Content::all();

    return View::make('ALL/Contents')->with('AllContent',$AllContent); 

1 个答案:

答案 0 :(得分:2)

我不知道为什么你不想使用SQL JOIN,因为当你有一个表通过其主键与另一个表相关时,它几乎肯定是最有效的。但是,嘿,我该判断谁?

您可以通过使用子查询来实现此目的。在普通的旧SQL中:

SELECT
    `content`.`id`,
    (
        SELECT `name`
        FROM `category`
        WHERE `id` = `content`.`category_id`
    ) AS `name`
FROM `content`

因此,要使用Laravel的查询构建器执行此操作:

DB::table('content')
    ->select(['id'])
    ->selectSub(function ($query) {
        return $query->from('category')
                     ->where('id', '=', DB::raw('content.category_id'))
                     ->select('name')
    }, 'name')
    ->get();

无论如何,我认为你会做你想做的事。但实际上,只需使用JOIN。

如果你想要使用JOIN,那么你会有所改善。我再次首先给你原始的SQL:

SELECT
    `content`.`id`,
    `category`.`name`
FROM `content`
LEFT JOIN `category`
    ON `content`.`category_id` = `category`.`id`

现在在Laravel的查询构建器中:

DB::table('content')
    ->join('category', 'content.category_id', '=', 'category.id')
    ->select(['content.id', 'category.name'])
    ->get();

现在使用Eloquent模型:

// app/Models/Content.php
namespace App\Models;

class Content
{
    protected $table = 'content';

    public function category()
    {
        return $this->belongsTo('App\Models\Category', 'category_id');
    }
}


// app/Models/category.php
namespace App\Models;

class Category
{
    protected $table = 'category';

    public function content()
    {
        return $this->hasMany('App\Models\Content', 'category_id');
    }
}

现在您可以使用此模型进行各种操作。例如,要做你最初尝试的事情:

// some controller somewhere
use App\Models\Content;

class SomeController
{
    public function index()
    {
        $content = Content::with('category')->get();

        return View::make('ALL/Contents')->with('AllContent', $content); 
    }
}

// views/ALL/Contents.blade.php
<ul>
    @foreach ($AllContent as $content)
        <li>
            {{ $content->id }} - {{ $content->category->name }}
        </li>
    @endforeach
</ul>

但是,您也可以将内容ID /类别名称作为键=&gt;值数组返回:

// in the controller
$content = Content::with('category')->lists('category.name', 'id');

// in the view
<ul>
    @foreach ($AllContent as $id => $category)
        <li>
            {{ $id }} - {{ $category }}
        </li>
    @endforeach
</ul>

这都是未经测试的,但应该有效。如果没有,它至少应该让你知道它们如何结合在一起。