Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [inny]Pomoc w wyszukiwarce, Laravel
casperii
post 7.08.2019, 19:38:51
Post #1





Grupa: Zarejestrowani
Postów: 605
Pomógł: 28
Dołączył: 14.08.2014

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


Panowie dopiero rozpoczynam przygodę z Laravel no i chciałbym się dowiedzieć jak rozbudować wyszukiwarkę ( na razie wyszukuje po miejscowości )
Chciałbym w wyszukiwarce mieć miejscowość (to już jest) oraz stanowisko lub branże , które należy wyciągać z tabel :

position_groups ( id, name)

1 , pracownik fizyczny

---

positions ( id, position_group_id, name )

1, 1 , malarz

---

jobs ( id, name, user_id, city_id, position_id, position_group_id )

1, Poszukiwany na już malarz, 1, 1, 1, 1


kod w pliku FrontendRepository.php

  1. public function getSearchResults( string $city)
  2. {
  3. return City::with(['jobs'])->where('name',$city)->first() questionmark.gif false;
  4. }



kod z pliku City.php

  1. <?php
  2.  
  3. namespace App;
  4.  
  5. use Illuminate\Database\Eloquent\Model;
  6.  
  7. class City extends Model
  8. {
  9. protected $guarded = [];
  10. public $timestamps = false;
  11.  
  12. public function jobs()
  13. {
  14. return $this->hasMany('App\JobOffer');
  15. }
  16.  
  17. }


oraz kod z pliku JobOffer.php
  1. <?php
  2.  
  3. namespace App;
  4.  
  5. use Illuminate\Database\Eloquent\Model;
  6. use Illuminate\Support\Facades\Auth;
  7.  
  8.  
  9. class JobOffer extends Model
  10. {
  11. protected $table = 'jobs';
  12. public $timestamps = false;
  13.  
  14. use Job\Presenters\ObjectPresenter;
  15.  
  16. public function scopeOrdered($query)
  17. {
  18. return $query->orderBy('name', 'asc');
  19. }
  20.  
  21. public function city()
  22. {
  23. return $this->belongsTo('App\City');
  24. }
  25.  
  26. public function region()
  27. {
  28. return $this->belongsTo('App\Region');
  29. }
  30.  
  31. public function province()
  32. {
  33. return $this->belongsTo('App\Province');
  34. }
  35.  
  36. public function country()
  37. {
  38. return $this->belongsTo('App\Country');
  39. }
  40.  
  41. public function agreement()
  42. {
  43. return $this->belongsTo('App\Agreement');
  44. }
  45.  
  46. public function agreementType()
  47. {
  48. return $this->belongsTo('App\AgreementType');
  49. }
  50.  
  51. public function work()
  52. {
  53. return $this->belongsTo('App\Work');
  54. }
  55.  
  56. public function position()
  57. {
  58. return $this->belongsTo('App\Position');
  59. }
  60.  
  61. public function positionGroup()
  62. {
  63. return $this->belongsTo('App\PositionGroup');
  64. }
  65.  
  66. public function user()
  67. {
  68. return $this->belongsTo('App\User');
  69. }
  70.  
  71. public function photos()
  72. {
  73. return $this->morphMany('App\Photo', 'photoable');
  74. }
  75. }



Czyli wpisując w input np malarz przeszuka mi w tabeli jobs z kolumny name name like wpisany% lub jeżeli ktoś wpiszę pracownik fizyczny to znajdzie to z tabeli position_groups lub z tabeli positions z kolumny name.
Go to the top of the page
+Quote Post
Lord
post 8.08.2019, 12:26:07
Post #2





Grupa: Zarejestrowani
Postów: 201
Pomógł: 29
Dołączył: 10.03.2004

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


  1. $search = 'cos';
  2. $users = User::whereHas('posts', function($q) use ($search){
  3. $q->where('description', LIKE', '%'.$search.'%');
  4. })->orWhereHas('comments', function($q) use ($search){
  5. $q->where('description', LIKE', '%'.$search.'%');
  6. })->get();


Chyba tak bym to zrobił...
Go to the top of the page
+Quote Post
casperii
post 8.08.2019, 19:06:55
Post #3





Grupa: Zarejestrowani
Postów: 605
Pomógł: 28
Dołączył: 14.08.2014

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


@Lord ale ten kod ma się nijak do mojego zapytania / kodu smile.gif
Go to the top of the page
+Quote Post
Lord
post 9.08.2019, 15:44:58
Post #4





Grupa: Zarejestrowani
Postów: 201
Pomógł: 29
Dołączył: 10.03.2004

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


Cytat(casperii @ 8.08.2019, 20:06:55 ) *
@Lord ale ten kod ma się nijak do mojego zapytania / kodu smile.gif

No jakiś ociemniały jestem tongue.gif. próbowałem teraz 3 razy przeczytać twój post i dalej nie wiem jaki masz problem wink.gif Praca jedna nie służy tongue.gif
Go to the top of the page
+Quote Post
casperii
post 15.08.2019, 21:40:15
Post #5





Grupa: Zarejestrowani
Postów: 605
Pomógł: 28
Dołączył: 14.08.2014

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


Napisze zatem raz jeszcze są 4 tabele:

city (id, name)
1, Warszawa
2, Wrocław
3, Zakopane

position_groups ( id, name)

1 , pracownik fizyczny

---

positions ( id, position_group_id, name )

1, 1 , malarz

---

jobs ( id, name, user_id, city_id, position_id, position_group_id )

1, Poszukiwany na już malarz, 1, 1, 1, 1


następnie jest formularz gdzie user wpisuje miejscowość i słowo kluczowe (branża, stanowisko) - te słowo powinno pobierać albo z tabeli jobs z kolumny name, lub z tabeli positions z pola name lub z tabeli positions_groups z pola name.

na chwilę obecną mam kod:

  1. public function getSearchResults( string $city)
  2. {
  3. return City::with(['jobs'])->where('name',$city)->first() ? ? false;
  4. }


powyższy kod tylko na chwilę obecna szuka tylko po miejscowości.
Rozumiem, że chyba do funkcji getSearchResults powinienem przekazywać drugą wartość z formularza ? czyli coś na styl getSearchResults( string $city, string $input ) ?
no i najważniejsze co powinienem zwracać w samej funkcji ?
Go to the top of the page
+Quote Post
john_doe
post 23.08.2019, 07:42:48
Post #6





Grupa: Zarejestrowani
Postów: 867
Pomógł: 25
Dołączył: 24.07.2005

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


1. jobs ( id, name, user_id, city_id, position_id, position_group_id ) ... ostatnie pole jest zbędne, masz position_id
2. Oczywiście, że przekazać ... a jak
3. Szukasz tylko po dwóch polach to możesz po prostu poszukać "po TYM polu" LUB "po INNYM polu" ___ szukaj pod "laravel orWhere", np. tu
Przemyśl czy za chwile nie zachce Ci się szukać po większej ilości bo wtedy ten pomysł "osłabnie" smile.gif
Wtedy są inne schematy działania...
Go to the top of the page
+Quote Post
casperii
post 24.08.2019, 14:41:54
Post #7





Grupa: Zarejestrowani
Postów: 605
Pomógł: 28
Dołączył: 14.08.2014

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


@john_doe
ad 1. position_id, position_group_id to tak jak by dwie różne tabele :
position_groups (to jest tak jakby grupa zawodowa) - np pracownik fizyczny.
Natomiast tabela positions zawiera już konkretne zawody np malarz, kafelkarz itd.
W input user może tak naprawdę wpisać "pracownik fizyczny" jak i "malarz", ale też powinno przeszukasz pole "name" w tabeli jobs.

ad 2. próbuje rozgryźć przekazanie tak jakby drugiego inputa ale otrzymuje błąd:
"Type error: Argument 2 passed to FrontendRepository::getSearchResults() must be of the type string, none given, called in

  1. public function getSearchResults( string $city, string $position )
  2. {
  3. return City::with(['jobs'])->where('name',$city)->orWhere('name', $position)->first() questionmark.gif false;
  4. }


oba pola są w tej samej tabeli "jobs".
Im bardziej brnę w laravela to coraz bardziej wydaje się trudniejszy.

Go to the top of the page
+Quote Post
viking
post 24.08.2019, 15:49:25
Post #8





Grupa: Zarejestrowani
Postów: 5 340
Pomógł: 897
Dołączył: 30.08.2006

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


Poczytaj https://laravel.com/docs/5.8/eloquent-relat...ing-eager-loads
Zastanów się nad stosowaniem ->when().


--------------------
Go to the top of the page
+Quote Post
casperii
post 24.08.2019, 18:49:00
Post #9





Grupa: Zarejestrowani
Postów: 605
Pomógł: 28
Dołączył: 14.08.2014

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


@viking no ok coś tam zaczynam jarzyć ale powiedz mi , a raczej proszę napisz mi w jaki sposób mam się odwołać do innej tabeli:


skoro nie chcę mi działać przekazanie drugiej wartości w funkcji getSearchResults() , to poszedłem na skróty i :

  1. public function getSearchResults( string $city)
  2. {
  3. return City::with(['jobs'])->where('name',$city)->where('description', 'LIKE', '%' . $_POST['position'] . '%')->first() questionmark.gif false;
  4. }


jak się można domyślać zwróci błąd:
Column not found: 1054 Unknown column 'description' in 'where clause' (SQL: select * from `cities` where `name` = Warszawa and `description` LIKE %malarz% limit 1
Go to the top of the page
+Quote Post
viking
post 24.08.2019, 19:15:24
Post #10





Grupa: Zarejestrowani
Postów: 5 340
Pomógł: 897
Dołączył: 30.08.2006

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


A jak wywołujesz funkcję skoro nie działa? W lv trzeba uważać na sql injection przy like a to co zrobiłeś to już maksymalna dziura.


--------------------
Go to the top of the page
+Quote Post
casperii
post 24.08.2019, 19:56:33
Post #11





Grupa: Zarejestrowani
Postów: 605
Pomógł: 28
Dołączył: 14.08.2014

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


@viking funkcje wywołuje poprzez routa:

  1. public function search(Request $request)
  2. {
  3. if($city = $this->fG->getSearchResults($request))
  4. {
  5. //dd($city);
  6. return $this->makeResponse('frontend.search',compact('city'));
  7. }
  8. }



Go to the top of the page
+Quote Post
viking
post 24.08.2019, 20:52:12
Post #12





Grupa: Zarejestrowani
Postów: 5 340
Pomógł: 897
Dołączył: 30.08.2006

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


Przecież przekazujesz obiekt Request a wymagasz 2 stringów.


--------------------
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: 18.09.2019 - 02:34