Как вернуть количество повторяющихся отношений с Laravel Eloquent - PullRequest
0 голосов
/ 05 марта 2020

У меня есть следующие таблицы Orders, Lamps и Lamp_Order, которые являются таблицей pivot. В таблице Lamp_Order хранятся id из Order и Lamp. Order может содержать несколько одинаковых Lamps. Так что может быть, например, есть 5 Lamps с id из 1, подключенным к тому же Order. Я хочу получить счет того же Lamps в Order. Таким образом, этот метод или функция, которую я хочу сделать, должен в этом случае вернуть 5.

В настоящее время у меня есть эта функция в моем OrderController для возврата Order с соответствующим Lamps:

public function index()
{
    $orders = Order::all();

    // Get the Lamps for each Order.
    foreach ($orders as $order) {
        $order->lamps;
    }

    return response()->json([
        'orders' => $orders
    ], 200);
}

Ответ в моем vue интерфейсе выглядит следующим образом: enter image description here

Как видите, возвращаются некоторые лампы с одинаковым идентификатором. Вместо этого я хотел бы вернуть эту Лампу со счетом того, сколько раз она связана с этой Order.

Моя Order модель выглядит следующим образом:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Order extends Model
{

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email'
    ];

    /**
     * Get related Image.
     *
     * @return void
     */
    public function image()
    {
        return $this->hasOne(Image::class);
    }

    /**
     * Get related Lamps.
     *
     * @return void
     */
    public function lamps()
    {
        return $this->belongsToMany(Lamp::class)->withPivot('room');
    }

    public function countSameRelationships()
    {
    }

    /**
     * Detach related lamps when deleting Orders.
     *
     * @return void
     */
    public static function boot()
    {
        parent::boot();

        static::deleting(function ($order) {
            $order->lamps()->detach();
        });
    }
}

Я был размышляю о создании функции в модели Order, которую я вызываю в функции index в OrderController. Может кто-нибудь сказать мне, есть ли какая-то уже существующая функция для подсчета этих «дублирующих» отношений? Или что было бы хорошим подходом для решения этой проблемы? Я предпочитаю решение возвращать правильные данные непосредственно из Laravel бэкэнда. Но если также возможно применить какую-то функцию фильтра для удаления и подсчета повторяющихся отношений, это также подойдет.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Хорошо, на данный момент я сделал следующее решение в моем Vue интерфейсе, так как мне не удалось решить проблему в моем интерфейсе:

  removeAndCountDuplicates(order) {
      // map to keep track of element
      // key : the properties of lamp (e.g name, fitting)
      // value : obj
      var map = new Map();

      // loop through each object in Order.
      order.forEach(data => {
        // loop through each properties in data.
          let currKey = JSON.stringify(data.name);
          let currValue = map.get(currKey);

          // if key exists, increment counter.
          if (currValue) {
            currValue.count += 1;
            map.set(currKey, currValue);
          } else {
            // otherwise, set new key with in new object.
            let newObj = {
              id: data.id,
              name: data.name,
              fitting: data.fitting,
              light_color_code: data.light_color_code,
              dimmability: data.dimmability,
              shape: data.shape,
              price: data.price,
              watt: data.watt,
              lumen: data.lumen,
              type: data.type,
              article_number: data.article_number,
              count: 1
            };
            map.set(currKey, newObj);
          }
      });

      // Make an array from map.
      const res = Array.from(map).map(e => e[1]);

      return res;
    },

Эта функция увеличивает счетчик и добавляет его к объекту. Если у кого-то есть решение, которое работает в бэк-энде, я бы тоже хотел увидеть этот ответ.

0 голосов
/ 05 марта 2020

Вы можете использовать Eager Загрузка в laravel:

public function index()
{

    $orders= User::with(['lamps' => function($query) {
            $query->select('lamps.id', DB::raw("COUNT('lamps.id') AS lamp_count"));
            $query->groupBy('lamps.user_id');
    }])->get();

    return response()->json([
        'orders' => $orders
    ], 200);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...