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