Laravel要使用什么关系来查看来自另一个模型和列的数据
我有两种型号 项目: 配方:Laravel要使用什么关系来查看来自另一个模型和列的数据,laravel,orm,Laravel,Orm,我有两种型号 项目: 配方: protected $fillable = [ 'recipecode', 'itemcode', 'qty' ]; public function item() { return $this->hasMany('App\Item'); } 在移民方面,我有: public function up() { Schema::table('recipes', function (Blueprint $table) {
protected $fillable = [
'recipecode',
'itemcode',
'qty'
];
public function item()
{
return $this->hasMany('App\Item');
}
在移民方面,我有:
public function up()
{
Schema::table('recipes', function (Blueprint $table) {
$table->foreign('itemcode')->references('code')->on('items');
});
}
在这方面,我有:
public function index()
{
$recipes = Recipe::all()->sortBy('recipecode');
$items = Item::all();
return view ('recipe.index', compact('recipes', 'items'));
}
我想在视图中看到recipecode、itemcode和ItemName、ItemQty等
@foreach($recipes as $recipe)
<tr>
<td>{{ $recipe->recipecode }}</td> // this works
<td>{{ $recipe->itemcode }}</td> // this works
<td>{{ $recipe->item->name }}</td> // this doesn't work
<td>{{ $recipe->item->uom }}</td> // this doesn't work
<td>{{ $recipe->item->qty }}</td> // this doesn't work
</tr>
@endforeach
@foreach($recipes作为$recipe)
{{$recipe->recipecode}}//这很有效
{{$recipe->itemcode}}//这很有效
{{$recipe->item->name}}//这不起作用
{{$recipe->item->uom}///这不起作用
{{$recipe->item->qty}//这不起作用
@endforeach
要查看Items表中的'name'和'uom'列,我应该做什么?我认为关系有问题…首先,
$recipe->item->name
不能像您预期的那样工作,因为$recipe->item
是App\item
的集合,而不是App\item
模型实例。这是因为您已将关系设置为“”
第二,请阅读更多关于。您现在所做的是多个查询。这是N+1,对于查询数据库以获取项目的每个配方。你不需要这样做,因为它根本就没有性能。使用Recipe::with('item')->sortBy('recipecode')->get()
现在,请记住,
$recipe->item
不是单个项目,而是属于该配方的项目的集合。您可能需要在表格上稍作修改,才能为一个配方显示多个项目。因为您使用的是hasMany
,所以在命名函数中必须遵循命名约定
public function items()
{
return $this->hasMany('App\Item');
}
在RecipesController中,您可以快速加载
$recipes = Recipe::with('items')->sortBy('recipecode')->get();
请阅读此处的文档:
也可以在你的刀片上显示
@foreach($recipes as $recipe)
<tr>
<td>{{ $recipe->recipecode }}</td> // this works
<td>{{ $recipe->itemcode }}</td> // this works
@foreach($recipe->items as $item)
<td>{{ $item->name }}</td>
@endforeach
</tr>
@endforeach
@foreach($recipes作为$recipe)
{{$recipe->recipecode}}//这很有效
{{$recipe->itemcode}}//这很有效
@foreach($recipe->items as$item)
{{$item->name}
@endforeach
@endforeach
其他答案分享了为什么您不能直接使用$recipe->item
。然而,我认为在数据库设计中有一个更大的错误
您设计的数据库具有一对多关系。比如,一个食谱有很多项目。然而,一个项目只有一个食谱的相反说法似乎是错误的。你可以用一个项目做很多食谱。也就是说,你可以用鸡肉做炸鸡和咖喱鸡
数据库的设计应该是这样的
recipes: code, name, uom
items: code, name
item_recipe: item_code, recipe_code, qty
第一行是“必须”跟随还是“应该”跟随?@NabilFarhan yes必须跟随才能轻松识别特定函数名的用法“必须”通常意味着没有它代码将无法运行。例如,您必须以分号结束语句。我认为在这种特殊情况下,应该看起来更合适。是的,为了便于阅读,你也可以区分复数和单数。
recipes: code, name, uom
items: code, name
item_recipe: item_code, recipe_code, qty