我花了两天时间来解决这个问题,但是没有运气。 我有3个表格,类别,项目和相关项目,每个项目都在一个类别下,并且类别可以有很多项目,这部分工作正常,现在问题出在相关项目中,我在表格中有realteditems 3个字段,id(just autoincrement),ritemf_id,riteml_id,它们是指items表中的item_id。 我想做的是显示项目及其详细信息和与此项目相关的项目,这意味着如果item1有很多实际项目,例如item2,item3,item4 ..因此需要这样显示
item_title: item1
相关项目:
item2
item3
item4
控制器
$items = Item::orderBy('category_id', 'asc')->with('category')->get()->groupBy('category_id');
$categories = Category::orderBy('category_id', 'asc')->get();
return view('home',['items' => $items,'ritems' => $ritems,'categories' => $categories]);
项目模式
public function category()
{
return $this->belongsTo('App\Category', 'category_id');
}
public function relateditems()
{
return $this->belongsTo('App\Relateditem', 'ritemf_id');
}
相关项目模式:
class Relateditem extends Model
{
protected $table="relateditems";
protected $fillable=['ritemf_id','riteml_id'];
protected $primaryKey='id';
public $timestamps=false;
public function items()
{
return $this->belongsTo('App\Item', 'item_id');
}
}
在刀片中显示其类别的项目(工作正常)
@if (!empty($categoryItems->first()->category))
{{ $categoryItems->first()->category->category_name }} @else {{$category_id}} @endif
@foreach($categoryItems as $item)
{{$item->item_title}}
${{$item->item_price}}
@endforeach
@endforeach
答案 0 :(得分:1)
relateditems()
定义在Item
模型中对我来说似乎不正确,项目可能有多个相关项目,那么应该是hasMany/beongsToMany
关联。
假设其hasMany
,然后将商品模型更新为
public function relateditems() {
return $this->hasMany('App\Relateditem', 'ritemf_id');
}
并渴望为每个项目加载相关项目
$items = Item::orderBy('category_id', 'asc')
->with(['category', 'relateditems'])
->get()
->groupBy('category_id');
我假设从集合类使用groupBy
方法对不在数据库端的检索到的数据进行分组
答案 1 :(得分:1)
您需要同时修复Item
模型和RelatedItem
模型中的两个关系。 relateditems应该为hasMany
,因为一个项目可以有许多相关项目。
您还需要使用belongsTo
键在RelatedItem与项之间定义riteml_id
关系
项目模式
public function category()
{
return $this->belongsTo('App\Category', 'category_id');
}
public function relateditems()
{
return $this->hasMany('App\Relateditem', 'ritemf_id');
}
相关项目模式:
class Relateditem extends Model
{
protected $table="relateditems";
protected $fillable=['ritemf_id','riteml_id'];
protected $primaryKey='id';
public $timestamps=false;
public function item() //i have change it to item instead items, because belongsTo always return single record
{
return $this->belongsTo('App\Item', 'riteml_id');
}
}
获取数据
$items = Item::orderBy('category_id', 'asc')->with('category','relateditems', 'relateditems.item')->get()->groupBy('category_id');
foreach($items as $categoryId => $groupItems){
echo $groupItems->first()->category;
foreach($groupItems as $item) {
echo $item->item_tile;
...
foreach($item->relateditems as $relatedItem){
if ($relatedItem->item){
echo $relatedItem->item->item_tile; //this will show you related item title
}
}
}
}
对于单个项目
$item = Item::with('category','relateditems', 'relateditems.item')->find(1);
foreach($item->relateditems as $relatedItem){
if ($relatedItem->item){
echo $relatedItem->item->item_tile; //this will show you related item title
}
}