Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [inny][laravel 5.2] Połączone zapytanie
miccom
post 19.05.2018, 23:59:20
Post #1





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Cześć smile.gif
W bazie danych w tabeli user mam nazwy 'pl01', 'pl03','pl05' i każda z tych wartości może się równać '0' lub '1'

dostarczam do funkcji stringa o konstrukcji np.:
  1. $string = 01|05

Rozbijam strninga explode
I teraz podstawiam sobie w pętli foreach
  1. foreach ($wojewodztwa as &$value) {
  2. $wynik = User::where('pl'.$value,'=',1)->get();
  3. }


I teraz jak wiadomo, ładuje mi tylko ostatnią pętlę smile.gif
Jak uzyskać dane gdy 'pl01'=1 OR 'pl05'=1 ?

Jak do wyników USER::where dodać 'pl01' z pierwszego rozbicia?

Ten post edytował miccom 20.05.2018, 00:04:11


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
SmokAnalog
post 20.05.2018, 00:22:11
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Zobacz: https://laravel.com/docs/5.2/queries#advanced-where-clauses

P.S. Coś mi się nie podoba Twoja struktura bazy :/
Go to the top of the page
+Quote Post
miccom
post 20.05.2018, 07:24:20
Post #3





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


A co mogę w niej zmienić?

A odnośnie zapytań to przestudiowałem to, bardziej chodzi mi o to, jak w kodzie rozwiązać te klauzule where

mam tabelę user a w niej rekordy name, email, i 'pl01' do 'pl16' oznaczające województwa, gdzie user zapisuje, w jakich województwach jest obecny.

Jak mógłbym to inaczej rozwiązać?

Ten post edytował miccom 20.05.2018, 07:27:43


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
viking
post 20.05.2018, 07:39:26
Post #4





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Tabela województwa, tabela użytkownicy i tabela użytkownicy województwa. Relacja wiele do wielu.


--------------------
Go to the top of the page
+Quote Post
miccom
post 20.05.2018, 08:41:56
Post #5





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


viking, a za rączkę?

Tworze tabelę o nazwie wojewodztwa i w niej wbijam województwa z ich ID
Tworzę tabelę użytkownicy i w niej id usera, email i jego dane
Tworzę tabelę użWoj i w niej...
No właśnie, co w niej dać?

Ten post edytował miccom 20.05.2018, 09:52:12


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
viking
post 20.05.2018, 08:46:16
Post #6





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Id użytkownika oraz id województwa z kluczem głównym na obu kolumnach. Poczytaj trochę o takich powiązaniach.


--------------------
Go to the top of the page
+Quote Post
miccom
post 20.05.2018, 10:33:47
Post #7





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Ściągnąłem mysql Workbech, ale nadal nie wiem jak połączyć tabele tymi kluczami smile.gif

Przygotowałem sobie diagram, potem export to sql i otrzymałem:


  1. -- MySQL Script generated by MySQL Workbench
  2. -- Sun May 20 11:52:46 2018
  3. -- Model: New Model Version: 1.0
  4. -- MySQL Workbench Forward Engineering
  5.  
  6. SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
  7. SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
  8. SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
  9.  
  10. -- -----------------------------------------------------
  11. -- Schema mydb
  12. -- -----------------------------------------------------
  13. DROP SCHEMA IF EXISTS `mydb` ;
  14.  
  15. -- -----------------------------------------------------
  16. -- Schema mydb
  17. -- -----------------------------------------------------
  18. CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
  19. SHOW WARNINGS;
  20. USE `mydb` ;
  21.  
  22. -- -----------------------------------------------------
  23. -- Table `users`
  24. -- -----------------------------------------------------
  25. DROP TABLE IF EXISTS `users` ;
  26.  
  27. SHOW WARNINGS;
  28. CREATE TABLE IF NOT EXISTS `users` (
  29. `id` INT NOT NULL,
  30. `email` VARCHAR(255) NULL,
  31. `name` VARCHAR(4255) NULL,
  32. PRIMARY KEY (`id`))
  33. ENGINE = InnoDB;
  34.  
  35. SHOW WARNINGS;
  36. CREATE UNIQUE INDEX `id_UNIQUE` ON `users` (`id` ASC);
  37.  
  38. SHOW WARNINGS;
  39.  
  40. -- -----------------------------------------------------
  41. -- Table `woj`
  42. -- -----------------------------------------------------
  43. DROP TABLE IF EXISTS `woj` ;
  44.  
  45. SHOW WARNINGS;
  46. CREATE TABLE IF NOT EXISTS `woj` (
  47. `idWoj` INT NULL,
  48. `name` VARCHAR(255) NULL,
  49. PRIMARY KEY (`idWoj`))
  50. ENGINE = InnoDB;
  51.  
  52. SHOW WARNINGS;
  53.  
  54. -- -----------------------------------------------------
  55. -- Table `users_has_woj`
  56. -- -----------------------------------------------------
  57. DROP TABLE IF EXISTS `users_has_woj` ;
  58.  
  59. SHOW WARNINGS;
  60. CREATE TABLE IF NOT EXISTS `users_has_woj` (
  61. `users_id` INT NOT NULL,
  62. `woj_idWoj` INT NOT NULL,
  63. PRIMARY KEY (`users_id`, `woj_idWoj`))
  64. ENGINE = InnoDB;
  65.  
  66. SHOW WARNINGS;
  67.  
  68. SET SQL_MODE=@OLD_SQL_MODE;
  69. SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
  70. SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
  71.  


Czy powyższe dobrze wykonałem?

Ten post edytował miccom 20.05.2018, 10:53:18


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
SmokAnalog
post 20.05.2018, 10:40:13
Post #8





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


W tabeli `userWoj` możesz ustawić klucz podstawowy na parę kolumn: `userWoj` i `wojId`. Ale tak jak masz też jest w porządku.

Ogólnie taka struktura bazy, która idzie wszerz przez mnogość opcji, jest w 99% przypadków niewłaściwa i problematyczna. Tym bardziej u Ciebie, gdzie jak się domyślam chodzi tylko o istnienie lub nieistnienie relacji użytkownik-województwo.
Go to the top of the page
+Quote Post
miccom
post 20.05.2018, 10:44:00
Post #9





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Cytat(SmokAnalog @ 20.05.2018, 11:40:13 ) *
W tabeli `userWoj` możesz ustawić klucz podstawowy na parę kolumn: `userWoj` i `wojId`. Ale tak jak masz też jest w porządku.

Ogólnie taka struktura bazy, która idzie wszerz przez mnogość opcji, jest w 99% przypadków niewłaściwa i problematyczna. Tym bardziej u Ciebie, gdzie jak się domyślam chodzi tylko o istnienie lub nieistnienie relacji użytkownik-województwo.


Edytowałem nowe połączenia tabel, czy zaktualizowany plik sql jest ok?


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
SmokAnalog
post 20.05.2018, 10:58:50
Post #10





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Tak, lepiej. Mógłbyś jeszcze trzymać się jednej konwencji, bo raz masz users, raz woj, razPiszeszTak, a_raz_tak. Indeksy unikalne nadałeś ręcznie? Bo nawet nie wiem czy one w dumpie się osobno pokazują dla klucza podstawowego. Jeśli ręcznie dałeś, to niepotrzebnie, bo klucz podstawowy sam w sobie jest unikalny z definicji.
Go to the top of the page
+Quote Post
miccom
post 20.05.2018, 12:07:15
Post #11





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


No tak, właśnie nie wiem czy pisać wielbłądzim czy z podkreślnikami, to samo dotyczy się nazewnictwa, users i woj wink.gif wiec albo tabele i ich nazwy po polsku albo po angielsku smile.gif

Niby nic ważnego, ale ułatwia pracę, muszę się nauczyć raz a porządnie co i jak stosować.

Indeksy nadałem w workbench ale w większości same były już zaznaczone jako PK,
a co do users_has_woj to workbench sam tak ustawił smile.gif

Czyli to będzie dobra architektura bazy?


  1. -- MySQL Script generated by MySQL Workbench
  2. -- Sun May 20 12:37:39 2018
  3. -- Model: New Model Version: 1.0
  4. -- MySQL Workbench Forward Engineering
  5.  
  6. SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
  7. SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
  8. SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
  9.  
  10. -- -----------------------------------------------------
  11. -- Schema mydb
  12. -- -----------------------------------------------------
  13. DROP SCHEMA IF EXISTS `mydb` ;
  14.  
  15. -- -----------------------------------------------------
  16. -- Schema mydb
  17. -- -----------------------------------------------------
  18. CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
  19. SHOW WARNINGS;
  20. USE `mydb` ;
  21.  
  22. -- -----------------------------------------------------
  23. -- Table `users`
  24. -- -----------------------------------------------------
  25. DROP TABLE IF EXISTS `users` ;
  26.  
  27. SHOW WARNINGS;
  28. CREATE TABLE IF NOT EXISTS `users` (
  29. `id` INT NOT NULL,
  30. `email` VARCHAR(255) NULL,
  31. `name` VARCHAR(255) NULL,
  32. `account` INT NULL COMMENT '1: użytkownik, 2:zespół / DJ',
  33. `password` VARCHAR(255) NOT NULL,
  34. `remember_token` VARCHAR(100) NULL,
  35. `created_at` TIMESTAMP(100) NULL DEFAULT NULL,
  36. `updated_at` TIMESTAMP(100) NULL DEFAULT NULL,
  37. `confCode` VARCHAR(255) NULL,
  38. PRIMARY KEY (`id`))
  39. ENGINE = InnoDB;
  40.  
  41. SHOW WARNINGS;
  42. CREATE UNIQUE INDEX `id_UNIQUE` ON `users` (`id` ASC);
  43.  
  44. SHOW WARNINGS;
  45.  
  46. -- -----------------------------------------------------
  47. -- Table `voivodeship`
  48. -- -----------------------------------------------------
  49. DROP TABLE IF EXISTS `voivodeship` ;
  50.  
  51. SHOW WARNINGS;
  52. CREATE TABLE IF NOT EXISTS `voivodeship` (
  53. `id_voivodeship` INT NOT NULL,
  54. `name` VARCHAR(255) NULL,
  55. PRIMARY KEY (`id_voivodeship`))
  56. ENGINE = InnoDB;
  57.  
  58. SHOW WARNINGS;
  59.  
  60. -- -----------------------------------------------------
  61. -- Table `users_has_voivodship`
  62. -- -----------------------------------------------------
  63. DROP TABLE IF EXISTS `users_has_voivodship` ;
  64.  
  65. SHOW WARNINGS;
  66. CREATE TABLE IF NOT EXISTS `users_has_voivodship` (
  67. `users_id` INT NOT NULL,
  68. `voivodeship_id_voivodeship` INT NOT NULL,
  69. PRIMARY KEY (`users_id`, `voivodeship_id_voivodeship`))
  70. ENGINE = InnoDB;
  71.  
  72. SHOW WARNINGS;
  73.  
  74. SET SQL_MODE=@OLD_SQL_MODE;
  75. SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
  76. SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;


Ok, więc skleciłem takie zapytanie:


  1. $users = DB::table('users')
  2. ->join('users_has_voivodeship', 'users.id', '=', 'users_id')
  3. ->join('voivodeship', function ($join) {
  4. $join->on('voivodeship.id_voivodeship', '=', 'users_has_voivodeship.voivodeship_id_voivodeship')
  5. ->where('users_has_voivodeship.voivodeship_id_voivodeship', '=', 5);
  6. })
  7. ->get();


I działa dla users_has_voivodeship.voivodeship_id_voivodeship = 5, ale jak wybrać jeszcze pozostałe które zostały dostarczone stringiem?

Ten post edytował miccom 20.05.2018, 12:55:07


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
viking
post 21.05.2018, 05:36:55
Post #12





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Nie jest dobrze bo w ostatniej tabeli nie zdefiniowales kluczy obcych.


--------------------
Go to the top of the page
+Quote Post
miccom
post 22.05.2018, 18:51:55
Post #13





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


A jak to stworzyć przy użyciu workbench?



--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
viking
post 22.05.2018, 19:42:47
Post #14





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


A google działa? https://dev.mysql.com/doc/workbench/en/wb-f...ationships.html


--------------------
Go to the top of the page
+Quote Post
miccom
post 1.06.2018, 18:59:26
Post #15





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


  1. -- MySQL Script generated by MySQL Workbench
  2. -- Tue May 22 22:21:11 2018
  3. -- Model: New Model Version: 1.0
  4. -- MySQL Workbench Forward Engineering
  5.  
  6. SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
  7. SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
  8. SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
  9.  
  10. -- -----------------------------------------------------
  11. -- Schema mydb
  12. -- -----------------------------------------------------
  13. DROP SCHEMA IF EXISTS `mydb` ;
  14.  
  15. -- -----------------------------------------------------
  16. -- Schema mydb
  17. -- -----------------------------------------------------
  18. CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
  19. SHOW WARNINGS;
  20. USE `mydb` ;
  21.  
  22. -- -----------------------------------------------------
  23. -- Table `users`
  24. -- -----------------------------------------------------
  25. DROP TABLE IF EXISTS `users` ;
  26.  
  27. SHOW WARNINGS;
  28. CREATE TABLE IF NOT EXISTS `users` (
  29. `id` INT NOT NULL,
  30. `email` VARCHAR(255) NULL,
  31. `name` VARCHAR(255) NULL,
  32. `account` INT NULL COMMENT '1: użytkownik, 2:zespół / DJ',
  33. `password` VARCHAR(255) NOT NULL,
  34. `remember_token` VARCHAR(100) NULL,
  35. `created_at` TIMESTAMP(100) NULL DEFAULT NULL,
  36. `updated_at` TIMESTAMP(100) NULL DEFAULT NULL,
  37. `confCode` VARCHAR(255) NULL COMMENT '\'0: nieaktywne, 1:potwierdzone\'\n',
  38. PRIMARY KEY (`id`))
  39. ENGINE = InnoDB;
  40.  
  41. SHOW WARNINGS;
  42.  
  43. -- -----------------------------------------------------
  44. -- Table `voivodeship`
  45. -- -----------------------------------------------------
  46. DROP TABLE IF EXISTS `voivodeship` ;
  47.  
  48. SHOW WARNINGS;
  49. CREATE TABLE IF NOT EXISTS `voivodeship` (
  50. `id_voivodeship` INT NULL,
  51. `name` VARCHAR(255) NULL,
  52. PRIMARY KEY (`id_voivodeship`))
  53. ENGINE = InnoDB;
  54.  
  55. SHOW WARNINGS;
  56.  
  57. -- -----------------------------------------------------
  58. -- Table `users_has_voivodeship`
  59. -- -----------------------------------------------------
  60. DROP TABLE IF EXISTS `users_has_voivodeship` ;
  61.  
  62. SHOW WARNINGS;
  63. CREATE TABLE IF NOT EXISTS `users_has_voivodeship` (
  64. `users_id` INT NOT NULL,
  65. `voivodeship_id_voivodeship` INT NOT NULL,
  66. PRIMARY KEY (`users_id`, `voivodeship_id_voivodeship`))
  67. ENGINE = InnoDB;
  68.  
  69. SHOW WARNINGS;
  70.  
  71. SET SQL_MODE=@OLD_SQL_MODE;
  72. SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
  73. SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;


Wpisuję many-to-many, dodaje mi się kolejna tabelka z relacjami, co mam jeszcze dodać?

Ponawiam pytanie.

Jak wyciągnąć dane przyporządkowane do szukanych id województw?
Dostarczam listę id województw w formacie string np. 1|5|9 rozbijam explodem i mam pojedyncze rekordy

Jak skonstruować zapytanie- aby wyciągnąć dane gdzie users_has_voivodeship.voivodeship_id_voivodeship = 1 OR users_has_voivodeship.voivodeship_id_voivodeship = 5 OR users_has_voivodeship.voivodeship_id_voivodeship = 9 ?

Nikt nie pomoże?

Kombinuję coś w ten deseń...

  1. $count = count($wojewodztwa);
  2. $users=array();
  3. for ($while = 0; $while < $count; $while++) {
  4. $users = DB::table('users')
  5. ->join('users_has_voivodeship', 'users.id', '=', 'users_id')
  6. ->where('users_has_voivodeship.voivodeship_id_voivodeship', '=', $wojewodztwa[$while])
  7. ->select('users.*', 'users_has_voivodeship.*')
  8. ->get();
  9. }



Tylko jak teraz wtłoczyć do tablicy $users kolejne wyniki z następnego województwa?


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
Pyton_000
post 1.06.2018, 19:00:07
Post #16





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


użycie `whereIn`?
Go to the top of the page
+Quote Post
miccom
post 1.06.2018, 19:04:25
Post #17





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Dziękuję bardzo.
Działa


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 14:28