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
public function getSearchResults( string $city) { return City::with(['jobs'])->where('name',$city)->first() false; }
<?php namespace App; use Illuminate\Database\Eloquent\Model; class City extends Model { protected $guarded = []; public $timestamps = false; public function jobs() { return $this->hasMany('App\JobOffer'); } }
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Auth; class JobOffer extends Model { protected $table = 'jobs'; public $timestamps = false; use Job\Presenters\ObjectPresenter; public function scopeOrdered($query) { return $query->orderBy('name', 'asc'); } public function city() { return $this->belongsTo('App\City'); } public function region() { return $this->belongsTo('App\Region'); } public function province() { return $this->belongsTo('App\Province'); } public function country() { return $this->belongsTo('App\Country'); } public function agreement() { return $this->belongsTo('App\Agreement'); } public function agreementType() { return $this->belongsTo('App\AgreementType'); } public function work() { return $this->belongsTo('App\Work'); } public function position() { return $this->belongsTo('App\Position'); } public function positionGroup() { return $this->belongsTo('App\PositionGroup'); } public function user() { return $this->belongsTo('App\User'); } public function photos() { return $this->morphMany('App\Photo', 'photoable'); } }
$search = 'cos'; $users = User::whereHas('posts', function($q) use ($search){ $q->where('description', LIKE', '%'.$search.'%'); })->orWhereHas('comments', function($q) use ($search){ $q->where('description', LIKE', '%'.$search.'%'); })->get();
@Lord ale ten kod ma się nijak do mojego zapytania / kodu
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:
public function getSearchResults( string $city) { return City::with(['jobs'])->where('name',$city)->first() ? ? false; }
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"
Wtedy są inne schematy działania...
@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
public function getSearchResults( string $city, string $position ) { return City::with(['jobs'])->where('name',$city)->orWhere('name', $position)->first() false; }
Poczytaj https://laravel.com/docs/5.8/eloquent-relationships#constraining-eager-loads
Zastanów się nad stosowaniem ->when().
@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 :
public function getSearchResults( string $city) { return City::with(['jobs'])->where('name',$city)->where('description', 'LIKE', '%' . $_POST['position'] . '%')->first() false; }
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.
@viking funkcje wywołuje poprzez routa:
public function search(Request $request) { if($city = $this->fG->getSearchResults($request)) { //dd($city); return $this->makeResponse('frontend.search',http://www.php.net/compact('city')); } }
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)