Laravel, какое отношение использовать, чтобы увидеть данные из другой модели и столбца - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть две модели

Артикул:

protected $fillable = [
    'code',
    'name',
    'uom'
];


public function recipe()
{
    return $this->belongsTo('App\Recipe');
}

Рецепт:

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');
    });
}

ВRecipesController У меня есть:

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

Что я должен сделать, чтобы увидеть «name» истолбцы 'uom' из таблицы Items?Я думаю, что есть проблема с отношениями ...

Ответы [ 3 ]

0 голосов
/ 24 сентября 2019

Поскольку вы используете hasMany, вы должны следовать соглашению об именах в функции именования

public function items()
{
    return $this->hasMany('App\Item');
}

В RecipesController вы можете загружать.

$recipes = Recipe::with('items')->sortBy('recipecode')->get();

Прочитайте документацию здесь: https://laravel.com/docs/master/eloquent-relationships

Также, чтобы показать это в вашем клинке

 @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
0 голосов
/ 24 сентября 2019

Другие ответы рассказывают, почему вы не можете напрямую использовать $recipe->item.Тем не менее, я думаю, что в дизайне базы данных есть большая ошибка.

Созданная вами база данных имеет отношение один ко многим.Мол, в одном рецепте много предметов.Однако обратное утверждение, что один предмет имеет только один рецепт, кажется неправильным.Вы можете приготовить множество рецептов с одним предметом.То есть вы можете приготовить курицу фри и курицу карри с курицей.

Дизайн базы данных должен выглядеть примерно так:

recipes: code, name, uom
items: code, name
item_recipe: item_code, recipe_code, qty
0 голосов
/ 24 сентября 2019

Во-первых, $recipe->item->name работает не так, как вы ожидали, потому что $recipe->item - это коллекция App\Item, а не App\Item экземпляр модели.Это потому, что вы установили отношение " hasMany "

Во-вторых, пожалуйста, прочитайте больше о нетерпеливая загрузка .То, что вы делаете сейчас, это несколько запросов.Это N + 1, для каждого рецепта вы запрашиваете базу данных, чтобы получить предметы.Вам не нужно этого делать, так как это вообще не нужно.Используйте Recipe::with('item')->sortBy('recipecode')->get().

Теперь имейте в виду, что $recipe->item - это не отдельный предмет, а набор предметов, принадлежащих этому рецепту.Вам, вероятно, придется немного поработать над своим столом, чтобы отобразить несколько предметов для одного рецепта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...