во первых: Вы неудачно подобрали названия таблиц и полей в них (и соответственно моделей)
1. shop_city - в комментария Вы пишите что это список филиалов, а судя по названию просто таблица связей. Уж лучше заменить ее название на что-то более подходящее, например (первое что пришло в голову): shop_office
2. shop_product_price - по названию можно сказать что это цены товаров в магазине, но если вникнуть, то оказывается что это цены товаров в ФИЛИАЛАХ МАГАЗИНА.
во вторых: связь выбирающая магазин должна находиться не в модели Product а в модели филиалов, да и с сами названия связей выбраны не удачно - только путают.
Т.е. в модели Товаров должна быть связь выбирающая филиалы, в модели филиала - связь выбирающая магазин
в третьих: когда Вы наведете порядок в связях, мы можете получить необходимую информацию либо с помощью запроса
Product::find()->with(['<название связи с филиалом>.<название связи филиала с магазином>'])
либо, если Вам нужно вывести товары у которых есть все связи
Product::find()->joinWith(['<название связи с филиалом>.<название связи филиала с магазином>'], true, 'RIGHT JOIN')