Добавление данных из другой модели в модель (laravel 5.4)

#php #laravel-5

#php #laravel-5

Вопрос:

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

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

Модель ваучеров:

таблица ваучеров

Модель VoucherSerial:

таблица voucher_serials

У каждого ваучера будет много серий

Модель пользовательского интерфейса:

таблица user_vouchers

Когда пользователь погасит ваучер, он будет сохранен в таблице user_vouchers. Я также определил взаимосвязь для всех моделей

В Voucher.php Я хочу добавить количество ваучеров, использованных пользователем.

  public function  getVoucherRedeemedAttribute()
{         
   //query to append the voucher redeemed count for each voucher
}
  

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

Я знаю, что мое объяснение относительно вопроса плохое, но мне нужна некоторая помощь по этому поводу. Надеюсь, кто-нибудь сможет мне помочь.

Заранее большое вам спасибо

Комментарии:

1. вместо eloquent вы можете использовать метод query builder . подробнее о запросе laravel.com/docs/5.7/queries . если вы не возражаете?

2. Спасибо за ваш ответ @Gaurav. Я постараюсь ознакомиться с вашим предложением 😉

Ответ №1:

Вы можете добавить количество связанных объектов к результату с помощью withCount метода:

Если вы хотите подсчитать количество результатов из отношения, фактически не загружая их, вы можете использовать метод withCount, который поместит столбец {relation}_count в ваши результирующие модели. Например:

 $posts = AppPost::withCount('comments')->get();

foreach ($posts as $post) {
    echo $post->comments_count;
}
  

Источник: https://laravel.com/docs/5.8/eloquent-relationships#counting-related-models

Если я правильно понимаю вашу проблему, вы хотите увеличить количество на один уровень глубже (количество ваучеров вместо количества серий ваучеров). Возможно, вы сможете использовать hasManyThrough связь:

Отношение «имеет много проходов» обеспечивает удобный ярлык для доступа к удаленным отношениям через промежуточное отношение. Например, модель страны может содержать множество моделей Post через промежуточную пользовательскую модель. В этом примере вы могли бы легко собрать все записи в блоге для данной страны.

Источник: https://laravel.com/docs/5.8/eloquent-relationships#has-many-through

В совокупности это будет выглядеть примерно так:

 class User {
    //...
    public function vouchers()
    {
        return $this->hasManyThrough(AppVoucher::class, AppVoucherSerial::class);
    }
}

// Controller
$user->withCount('vouchers');
  

На самом деле я никогда не использовал withCount и hasManyThrough вместе, но это должно сработать 😉

Комментарии:

1. Большое спасибо за вашу помощь @Thomas. Это работает отлично 🙂

2. Пожалуйста. И, пожалуйста, не забудьте отметить ответ как принятый .