Próbowałem osiągnąć 4 sposobu dołączenia / filtra na podstawie 4 tabel "Oferty", "UserPaymentMethods" i tabelę połączeniową "OferujeSerPaymentMethods" zdefiniowane poniżej;

Chcę więc filtrować "Oferty" na podstawie payment_method_id, ponieważ offer_id mieszka w offers_user_payment_methods, co sprawia, że jest trochę trudna. Front-End wyśle payment_method_id i muszę filtrować oferty na podstawie payment_method_id.

CREATE TABLE `offers_user_payment_methods` (
  `offer_id` bigint(20) unsigned NOT NULL,
  `user_payment_method_id` bigint(20) unsigned NOT NULL
)
CREATE TABLE `offers` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_uid` longtext NOT NULL,
  `base` varchar(20) NOT NULL,
  `quote` varchar(20) NOT NULL,
  `side` longtext NOT NULL,
  `price` decimal(32,16) NOT NULL,
  `origin_amount` decimal(32,16) NOT NULL,
  `available_amount` decimal(32,16) NOT NULL,
  `min_order_amount` decimal(32,16) NOT NULL,
  `max_order_amount` decimal(32,16) NOT NULL,
  `payment_time_limit` bigint(20) unsigned NOT NULL,
  `state` longtext NOT NULL,
  `created_at` datetime(3) DEFAULT NULL,
  `updated_at` datetime(3) DEFAULT NULL
)
CREATE TABLE `user_payment_methods` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_uid` longtext NOT NULL,
  `payment_method_id` bigint(20) unsigned DEFAULT NULL,
  `data` json DEFAULT NULL,
  `created_at` datetime(3) DEFAULT NULL,
  `updated_at` datetime(3) DEFAULT NULL,
)
CREATE TABLE `payment_methods` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `type` longtext NOT NULL,
  `bank_name` longtext NOT NULL,
  `logo` longtext NOT NULL,
  `options` json DEFAULT NULL,
  `enabled` tinyint(1) NOT NULL,
  `created_at` datetime(3) DEFAULT NULL,
  `updated_at` datetime(3) DEFAULT NULL
)
0
Alireza Bashiri 15 kwiecień 2021, 09:39

1 odpowiedź

Najlepsza odpowiedź

Będziesz walczyć z tym efektywnie i całkowicie z Gorm . Wstępne ładowanie / stowarzyszenia nie zostały wykonane przy użyciu join s w Gorm i Nie ma sposób filtrowania na podstawie nich. Widzę dwie potencjalne opcje:

1. Wpisz własne zapytanie za pomocą join s i skanowanie w wynikach

Możesz użyć Gorm do zapytania i wykonania, ale szczerze mówiąc, właśnie uniknię wszelkiej potrzeby odbicia itp. I po prostu zdefiniuj strukturę i skanowanie prosto do tego.

Wyniki będą zawierać zduplikowane dane, więc będziesz musiał ręcznie transponować wyniki i zbudować obiekt.

3. Wykonaj dwa zapytania, aby znaleźć identyfikatory ofert i znajdziesz oferty

Pierwsze zapytanie byłoby odpowiednikiem:

SELECT offers_user_payment_methods.offer_id FROM offers_user_payment_methods
INNER JOIN user_payment_methods ON offers_user_payment_methods. user_payment_method_id = user_payment_methods.id
WHERE user_payment_methods.payment_method_id = ?

Jeśli zeskanujesz te wyniki na var offerIDs []int, możesz użyć gorm do Znajdź oferty, przekazując ten kawałek jako param:

offers := make(Offer, 0)
db.Find(&offers, offerIDs)

Myślę, że to rozwiązanie ma korzyść z Ciebie bardziej złożona i zostaw łatwe rzeczy do Gorm (co jest tym, co robi ~ OK ).

1
Christian 15 kwiecień 2021, 09:35