Как связать данные в Laravel?

96
18 января 2022, 04:20

Как связать данные в Laravel? Есть 3 таблицы:

  1. Manufacturers
  2. Collections
  3. Colors

Эти таблицы используют отношение One To Many. У Manufacturer может быть много Collection. У Collection может быть много Color.

Как посчитать сколько коллекций принадлежит производителю и сколько всего цветов? Производитель 1 имеет 2 коллекции каждая из которых содержит по 10 цвет.

Желаемый результат:

  1. Производитель 1
  2. Коллекции 2
  3. Цветов 20

Model, Controller и View. Остальное 2 идентичны.

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Manufacturer extends Model
{
    public function collections()
    {
        return $this->hasMany('App\Collection');
    }
}

.

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Manufacturer;
class ManufacturerController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $manufacturers = Manufacturer::all();
        return view('admin.manufacturers.index', compact('manufacturers'));
    }
}

.

@extends('layouts.admin')
@section('content')
<table class="table">
    <thead>
        <tr>
            <th scope="col">Производитель</th>
            <th scope="col">Коллекция</th>
            <th scope="col">Цвет</th>
        </tr>
    </thead>
    <tbody>
        <tr>
        @foreach ($manufacturers as $manufacturer)
            <td><a href="{{ route('manufacturers.edit', $manufacturer->id) }}">{{ $manufacturer->name }}</a></td>
            <td><a href="{{ route('collections.index', ['manufacturer' => $manufacturer->id]) }}">2</a></td>
            <td><a href="{{ route('colors.index', ['manufacturer' => $manufacturer->id]) }}">5</a></td>
        @endforeach
        </tr>
    </tbody>
</table>
@endsection
Answer 1

Посмотрите связь: has-many-through возможно она наведет на решение.

Код примерный:

class Manufacturer extends Model
{
    public function colors()
    {
        return $this->hasManyThrough('App\Colors','App\Collection');
    }
}

Так же из задачи не понятно нужны уникальные цвета или нет, а это разные решения.

Ставить id производителя в таблицу цветов думаю плохая идея.

Если брать не связь, а решение конкретной задачи, то

1) Можно написать 2 запроса через queryBuilder на нахождение количества

2) Коллекции посчитать через Лара-коллекции, а цвета через sql, что-то примерно:

$result = Manufacturer::with(['collections'=>function($query){
    $query->withCount('colors');
}])->get();
$collections = $result->pluck('collections')->collapse();
$collectionsCount = $collections->count();
$colorsCount = $collections->sum('colors_count');
READ ALSO
Вывод определённых данных из строки при помощи RedBean

Вывод определённых данных из строки при помощи RedBean

Как при помощи ORM RedBean вывести определённые данные? У меня есть таблица, которая называется "users", в ней есть 3 столбца: "id", "steamid" и "balance" Первая...

92
Сумма сумм MYSQL

Сумма сумм MYSQL

Как посчитать сумму сумм в mysql? Те у меня есть запрос

192
Как вывести пару объектов массива сразу

Как вывести пару объектов массива сразу

Возможно ли вывести сразу несколько объектов массива?

73
Добавить поддомен через js

Добавить поддомен через js

Я делаю переадресацию на поддомен в зависимости от выбранного городаУ меня получается сделать редирект только на конкретный URL, а нужно чтобы...

145