Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Frameworki _ [inny]Pomoc w wyszukiwarce

Napisany przez: casperii 7.08.2019, 19:38:51

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.

Napisany przez: Lord 8.08.2019, 12:26:07

  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ł...

Napisany przez: casperii 8.08.2019, 19:06:55

@Lord ale ten kod ma się nijak do mojego zapytania / kodu smile.gif

Napisany przez: Lord 9.08.2019, 15:44:58

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

Napisany przez: casperii 15.08.2019, 21:40:15

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 ?

Napisany przez: john_doe 23.08.2019, 07:42:48

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", https://stackoverflow.com/questions/18660180/laravel-or-where
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...

Napisany przez: casperii 24.08.2019, 14:41:54

@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.


Napisany przez: viking 24.08.2019, 15:49:25

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

Napisany przez: casperii 24.08.2019, 18:49:00

@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

Napisany przez: viking 24.08.2019, 19:15:24

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.

Napisany przez: casperii 24.08.2019, 19:56:33

@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',http://www.php.net/compact('city'));
  7. }
  8. }




Napisany przez: viking 24.08.2019, 20:52:12

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)