Inner Join-Laravel - PullRequest
       1

Inner Join-Laravel

0 голосов
/ 21 сентября 2018

У меня есть три таблицы в моей базе данных.Пользователь, работодатель и вакансии.

Некоторые пользователи - это работодатели, которые опубликовали некоторые вакансии.

Я пытаюсь отобразить вакансии пользователей.Мой код: Модель пользователя

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

Маршруты:

Route::get('/find_user_jobs',function(){
    $user=User::find(1);
    foreach($user->jobs as $job){
        echo $job->created_at."<br>";
    }
});

Но я получаю эту ошибку

 Column not found: 1054 Unknown column 'jobs.user_id' in 'field list' (SQL: select `employers`.*, `jobs`.`user_id` from `employers` inner join `jobs` on `jobs`.`id` = `employers`.`job_id` where `jobs`.`user_id` = 1)

Я получаю, что она пытается найти user_id в рабочих местах, новот что я хочу сделать

Мое желание программы Когда я даю идентификатор пользователя, переходите к таблице работодателей, ищите user_id, если он существует, переходите к таблице вакансий и ищитедля Employers_id и вернуть все рабочие места с Employer_id.

Миграция пользователя

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->integer('employer_id');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }
}

Миграция работы

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateJobsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('jobs', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('employer_id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('jobs');
    }
}

Миграция работодателя

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateEmployersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('employers', function (Blueprint $table) {
            $table->increments('id');
            $table->string('company_name');
            $table->integer('user_id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('employers');
    }
}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Аргументы отношения расположены в неправильном порядке:

public function jobs(){
    return $this->hasManyThrough('App\Job', 'App\Employer');
}
0 голосов
/ 21 сентября 2018

Поскольку Employee - это User с Jobs, вы можете создать модель App\Employee, которая расширяет App\User Модель

class Job {

    public function employee()
    {
        return $this->belongsTo(App\Employee::class,'user_id');
    }
}

и создать класс Employee, подобный этому

Здесь, в модели Employee, я устанавливаю для свойства $table значение users, когда мы выполняем какой-либо запрос, в этом запросе целевая таблица будет установлена ​​на users вместо таблицы employees, которая будетПоведение Eloquent по умолчанию.

class Employee extends User
{
    protected $table = "users";

    public function jobs()
    {
        return $this->hasMany(Job::class, 'user_id');
    }
}

Вы можете напрямую использовать модель Employee и получить jobs

А вот соответствующая миграция

create_user_table

class CreateUsersTable extends Migration
{

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->string('company_name')->nullable();
            $table->rememberToken();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('users');
    }
}

create_job_table

class CreateJobsTable extends Migration
{

    public function up()
    {
        Schema::create('jobs', function (Blueprint $table) {
            $table->increments('id');
            $table->integer("user_id")->unsigned();
            $table->foreign('user_id')->references('id')->on('users');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('jobs');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...