У меня в базе данных три таблицы. Пользователь, работодатель и вакансии.
Некоторые пользователи являются работодателями, которые разместили несколько вакансий.
Я пытаюсь отображать вакансии по пользователям. Мой код: Модель пользователя
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');
}
}
Готово @JonasStaudenmeir






Поскольку 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');
}
}
Применимо ли это, даже если у меня разные таблицы для пользователей и работодателей.
Не работает братан. новый столбец ошибок не найден: 1054 Неизвестный столбец «jobs.user_id» в «списке полей» (SQL: выберите users. *, jobs.user_id из внутреннего соединения usersjobs на jobs.id = users.job_id, где jobs.user_id = 1)
это заставляет вас иметь только одну таблицу, которая устарела для вашего пользователя, поскольку сотрудник в первую очередь является пользователем, вам не нужно создавать отдельную таблицу для сохранения этого особого типа пользователя, вы можете просто расширить модель User, как я говорю.
Если вам нужно разделить модель, зачем вам проходить через User Model, потому что вы хотите получить вакансии для данного сотрудника? использовать напрямую Employee и передать данный идентификатор методу find
Аргументы отношения расположены в неправильном порядке:
public function jobs(){
return $this->hasManyThrough('App\Job', 'App\Employer');
}
Первый аргумент указывает модель, которую вы хотите получить, второй - промежуточную модель.
Выложите, пожалуйста, три миграции.