2016-12-14 3 views
0

У меня есть две таблицы как «рабочие места» и «желаемые_скиллы». Структура таблицы выглядит следующим образом.Внутреннее соединение Laravel 5.3 не работает должным образом

рабочие столы jobs Table

desired_skills стол desired_skils table

где desired_skills.job_id относится к jobs.job ID

В контроллере я (я получаю $ идентификатор в качестве аргумента из URL , и я могу подтвердить, что аргумент захватывает желаемое значение)

$jobs = DB::table('jobs')->where(function ($query) use ($id) { 
    $query->Join('desired_skills', 'desired_skills.job_id', '=', 'jobs.job_id') 
    ->where('jobs.employer_id', '=', $id); 
    ->select('*') 
})->get(); 

Когда я дамп и умираю $ jobs, он возвращает значения из таблицы заданий. , но когда я запустил запрос

SELECT * FROM jobs INNER JOIN desired_skills ON desired_skills.job_id = jobs.job_id он возвращает заданное значение.

Что я делаю неправильно? Любая помощь будет оценена.

+0

Вы когда-нибудь слышали о [красноречивых отношениях] (https://laravel.com/docs/5.3/eloquent-relationships)?! –

+0

yep, но с дальнейшим развитием его собираются усердно с красноречивым. поэтому я выбрал построение запроса. – 14k

ответ

2

Я думаю, что это связано с завершением вашего соединения внутри предложения where. Я не думаю, что это дает вам желаемый запрос с этим.

$jobs = DB::table('jobs') 
    ->join('desired_skills', 'desired_skills.job_id', '=', 'jobs.job_id') 
    ->where('jobs.employer_id', '=', $id) 
    ->get(); 
+0

Спасибо человеку. он завопил. :) Интересно, что там произошло с упаковкой. Еще раз спасибо за быстрый ответ. – 14k

0

Попробуйте это:

$jobs = DB::table('jobs') 
       ->join('desired_skills', 'desired_skills.job_id', '=', 'jobs.job_id') 
       ->select('jobs.*', 'desired_skills.*') 
       ->get(); 
0

Запрос SELECT * FROM jobs INNER JOIN desired_skills ON desired_skills.job_id = jobs.job_id не то же самое имеет то, что вы пытаетесь сделать в функции. В этом запросе не указано упоминание «employer_id» в заданиях таблицы.

Альтернативой было бы использование красноречивых отношений, как указано в комментарии.

Вам нужно 3-х классов в моделях:

Работодатель Работа DesiredSkill

между Работодателем и Работа ->one-to-many relation (работодатель может иметь несколько рабочих мест).

Между DesiredSkill и Job ->one-to-one relation.

Я не уверен, что вы пытаетесь получить от соединения, но я думаю, что если вы реализуете методы, которые позволяют отношениям, я считаю, что вы решаете что угодно.

class Job extends Model 
{ 

    public function employer() 
    { 
     return $this->hasOne('App\Job'); 
    } 
} 

class Employer extends Model 
{ 

    public function jobs() 
    { 
     return $this->hasMany('App\Employer'); 
    } 

    public function desiredSkill() 
    { 
     return $this->hasOne('App\DesiredSkill'); 
    } 
} 

class DesiredSkill extends Model 
{ 

    public function job() 
    { 
     return $this->hasOne('App\DesiredSkill'); 
    } 
} 
Смежные вопросы