我有 4 张桌子:
我的人际关系应该是这样的:
商品只能有一种尺寸、颜色和类别。
这应该有效,但实际上并非如此。生成的查询返回错误的结果。
这是我的模型文件:
<?php
class Shop_Item extends Eloquent
{
public static $table = 'items';
public static $timestamps = false;
public function scategory() {
return $this->has_one('Shop_Category','id');
}
public function ssize() {
return $this->has_one('Shop_Size','id');
}
public function scolor() {
return $this->has_one('Shop_Color','id');
}
}
其余表的其余模型文件相同(表名和模型名除外)。
<?php
class Shop_Category extends Eloquent
{
public static $table = 'item_categories';
public static $timestamps = false;
}
因此,当我尝试访问额外的值(大小-> 名称、颜色-> 名称、类别-> 名称)时,我得到了错误的结果。
我的数据库中有两条测试记录:项目 1 和项目 2,颜色、大小和类别不同。项目 1 为蓝色,大小为 M,项目 2 为绿色,大小为 XL,但在返回的查询中没有。这告诉我,项目 2 是红色的,大小为 S。
控制器:
<?php
class Admin_Shop_Controller extends Base_Controller {
public function action_index() {
$items = Shop_item::order_by('name')->paginate(10,array('id','name','price','sex','visible','color','size','category'));
return View::make('admin.shop.index')->with('items', $items);
}
看法:
@forelse($items->results as $i)
{{ $i->name }}
{{ $i->price }}
{{ $i->sex }}
{{ $i->scategory->name }}
{{ $i->scolor->name }}
{{ $i->ssize->name }}
<a href = "{{ URL::to('admin/shop/edit/'.$i->id) }}">Edit</a>
<a href = "#">Delete</a>
@empty
There are no items in the shop.
@endforelse
生成的查询:
0.23ms
SELECT COUNT(`id`) AS `aggregate` FROM `items`
0.28ms
SELECT `id`, `name`, `price`, `sex`, `visible`, `color`, `size`, `category` FROM `items` ORDER BY `name` ASC LIMIT 10 OFFSET 0
0.25ms
SELECT * FROM `item_categories` WHERE `id` IN ('1', '2')
0.21ms
SELECT * FROM `item_sizes` WHERE `id` IN ('1', '2')
0.36ms
SELECT * FROM `item_colors` WHERE `id` IN ('1', '2')
请注意,如果我像这样从另一个表中访问这些值,则在视图中:
{{ Shop_Color::find($i->color)->name }}
它让我得到了正确的结果,但我真的不想因此查询数据库 n+3 次。任何建议我做错了什么?
编辑: 仍然没有运气。:( 我已经完成了您列出的更改,并对其进行了试验,但这仍然无法正常工作。当前错误是:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'where clause'
SQL: SELECT * FROM `item_colors` WHERE `id` IN (?)
Bindings: array (
0 => 0,
)
我不知道它为什么要查找 id,我已经更改了对子表的所有引用并适当地重命名了列。:(