Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inny]Pomoc w wyszukiwarce
Forum PHP.pl > Forum > PHP > Frameworki
casperii
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.
Lord
  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ł...
casperii
@Lord ale ten kod ma się nijak do mojego zapytania / kodu smile.gif
Lord
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
casperii
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 ?
john_doe
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...
casperii
@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.

viking
Poczytaj https://laravel.com/docs/5.8/eloquent-relat...ing-eager-loads
Zastanów się nad stosowaniem ->when().
casperii
@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
viking
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.
casperii
@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. }



viking
Przecież przekazujesz obiekt Request a wymagasz 2 stringów.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.