Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 22.07.2016 13:56:44

Testuser123

Связать 3 таблицы

Здравствуйте. Есть таблица 'products', 'vendors' и 'prices'. Они пока не как не связаны. Хочу сделать что бы вендоры могли устанавливать цены на товары. Вопрос в том как их всех грамотно связать? Есть варриант: вендоры относятся к товарам, цены относятся к вендорам, и товары имеют цены через вендоров. Но возникает вопрос, как товар будит получать именно свою цену? Получается хто не правильная структура. У кого нибудь есть идеи?)

#2 22.07.2016 14:02:04

Re: Связать 3 таблицы

https://laravel-news.ru/blog/tutorials/eloquent-relations#many-to-many
—>Работа с данными связующих таблиц

prices = product_id, vendor_id, price

Т.е. товар связан с вендором через m2m, в связующей таблице есть доп поле pprice

Не в сети

#3 22.07.2016 15:06:06

Testuser123

Re: Связать 3 таблицы

VitalN
Спасибо. Попробую с этой структурой сделать

#4 25.07.2016 12:49:50

Testuser123

Re: Связать 3 таблицы

Продолжение темы.
Все четко работает, но теперь хочу сделать систему тракинга, что б записывать переходы пользователей.
Сейчас таблица цен такая:
product_id | vendor_id | price | link
Таблица тракинга:
user_token  | vendor_id
Роут: Route::get('vendor/{id}', 'VendorController@clickTracking');
Вопрос в том,  как правильно сделать ссылку что бы записать токен пользователя и ссылку вендора на которую произойдет редирект? Пример

<a href="{{ url('vendor/' . $vendor-id . '?token=' .csrf_token()) }}">перейти</a>

И как можно отследить пользователя который уже кликнул на ссылку? Ставить кук? Писать в сессию? Или?

#5 25.07.2016 13:10:47

Re: Связать 3 таблицы

  1. Таблица тракинга:
  2. user_token | vendor_id

А product_id не нужен?
Сформируй задачу точнее
Csrf-токен зачем писать? Типа уникальные переходы считать?

Не в сети

#6 25.07.2016 13:41:47

Testuser123

Re: Связать 3 таблицы

VitalN пишет:

}%>Таблица тракинга:
>user_token  | vendor_id

А product_id не нужен?
Сформируй задачу точнее
Csrf-токен  зачем писать? Типа уникальные переходы считать?

Product_id забыл)
Да, токен что бы считать пользователя. Что бы он не накручивал клики.
Вообще это мне для того, что бы можно было показать вендору статистику переходов в его магазин. Столько то переходов за сегодня, столько то за месяц. Примерно как на хотлайне, яндекс маркет, прайс ру.
Вот такую систему хочу сделать

#7 25.07.2016 14:02:16

Re: Связать 3 таблицы

Гугл аналитикс прицепи )

Или свой счетчик на станицы ставить придется
какой-нить пиксель, который при загрузке отправляет запрос на запись статистики.

Редиректы — это утопия, пользователи могут же и по прямым ссылкам приходить…

Не в сети

#8 27.07.2016 08:39:24

Testuser123

Re: Связать 3 таблицы

Надо вычислить среднюю цену. Цены находятся в связующей таблице. Самую маленькую и самую большую цену я вычисляю так

$small = $product->vendors()->orderBy('pivot_price', 'asc')->first();
$large = $product->vendorss()->orderBy('pivot_price', 'desc')->first();

В шаблоне уже так

<div class="prices">
    {{ $small->pivot->price }} - {{ $large->pivot->price }}
</div>

Знаю что есть функция avg(); , но чет не знаю куда ее впихнуть. Подскажите)

#9 27.07.2016 18:12:21

Re: Связать 3 таблицы

SELECT AVG(field) AS fieldName FROM table
$average = $product->vendors()->selectRaw('AVG(field)')
или что-то в том духе... архитектуры не видел, подсказаить точнее не могу.

Не в сети

#10 28.07.2016 09:03:41

Testuser123

Re: Связать 3 таблицы

hzone Спасибо за наводку.
В итоге все оказалось очень просто.

// Пивотная таблица
product_id | vendor_id | price | link

Задача была в том, что бы посчитать самое маленькое значение поля "price", самое большое, и среднее. Решение ниже

$small = $product->vendors()->min('price');
$large = $product->vendors()->max('price');
$avg = $product->vendors()->avg('price');

#11 28.07.2016 09:11:20

Re: Связать 3 таблицы

в 1 запрос
SELECT MIN(field) AS field_min, AVG(field) AS field_avg, MAX(field) AS field_max

Изменено hzone (28.07.2016 09:11:34)

Не в сети

#12 30.07.2016 15:14:41

Testuser123

Re: Связать 3 таблицы

hzone пишет:

в 1 запрос
SELECT MIN(field) AS field_min, AVG(field) AS field_avg, MAX(field) AS field_max

С элокуэнт в 1 запрос не выходит

#13 30.07.2016 22:11:38

Re: Связать 3 таблицы

Model::selectRaw('MIN(field) AS field_min, AVG(field) AS field_avg, MAX(field) AS field_max')->first()

Не в сети

#14 30.07.2016 22:27:25

Testuser123

Re: Связать 3 таблицы

hzone пишет:

Model::selectRaw('MIN(field) AS field_min, AVG(field) AS field_avg, MAX(field) AS field_max')->first()

Спасиб) незнал что так можно)

Подвал раздела