#php #laravel-5
#php #laravel-5
Вопрос:
Я хочу добавить количество данных из таблицы в моей базе данных, но у меня проблема с взаимосвязью.
У меня есть 3 модели
Модель ваучеров:
Модель VoucherSerial:
У каждого ваучера будет много серий
Модель пользовательского интерфейса:
Когда пользователь погасит ваучер, он будет сохранен в таблице 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. Пожалуйста. И, пожалуйста, не забудьте отметить ответ как принятый .