有两种表类别和内容。 内容表有id,category_id
类别表有类别名称和ID
我必须从类别名称中获取内容表中的所有内容,该类别名称在类别表中。
我不想使用JOIN。
请建议我使用其他查询。
控制器
$AllContent=Content::all();
return View::make('ALL/Contents')->with('AllContent',$AllContent);
答案 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>
这都是未经测试的,但应该有效。如果没有,它至少应该让你知道它们如何结合在一起。