Внутреннее соединение-Laravel

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

Некоторые пользователи являются работодателями, которые разместили несколько вакансий.

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

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, если он существует, перейдите в таблицу вакансий и найдите работодатель_ид и верните все вакансии с идентификатором работодателя.

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

<?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');
    }
}

Выложите, пожалуйста, три миграции.

Jonas Staudenmeir 21.09.2018 14:40

Готово @JonasStaudenmeir

ahsan 21.09.2018 14:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
206
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поскольку 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');
    }
}

Применимо ли это, даже если у меня разные таблицы для пользователей и работодателей.

ahsan 21.09.2018 14:52

Не работает братан. новый столбец ошибок не найден: 1054 Неизвестный столбец «jobs.user_id» в «списке полей» (SQL: выберите users. *, jobs.user_id из внутреннего соединения usersjobs на jobs.id = users.job_id, где jobs.user_id = 1)

ahsan 21.09.2018 14:55

это заставляет вас иметь только одну таблицу, которая устарела для вашего пользователя, поскольку сотрудник в первую очередь является пользователем, вам не нужно создавать отдельную таблицу для сохранения этого особого типа пользователя, вы можете просто расширить модель User, как я говорю.

Yves Kipondo 21.09.2018 14:57

Если вам нужно разделить модель, зачем вам проходить через User Model, потому что вы хотите получить вакансии для данного сотрудника? использовать напрямую Employee и передать данный идентификатор методу find

Yves Kipondo 21.09.2018 14:59
Ответ принят как подходящий

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

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

Первый аргумент указывает модель, которую вы хотите получить, второй - промежуточную модель.

Jonas Staudenmeir 21.09.2018 15:11

Другие вопросы по теме