Модель Laravel Eloquent: 2 поля, один fk ссылается на 2 поля в другой таблице

Я хочу использовать модели и отношения Laravel Eloquent для объединения данных из всех таблиц в моем проекте; однако у меня проблема с переводом этих отношений. Например, у меня есть две таблицы; первая — это таблица «Книги», а другая — «Автор».

Schema::create('books', function (Blueprint $table) {
    $table->increments('id');
    $table->string('code', 20)->unique('ak_books__code')->nullable(false);
    $table->smallInteger('books_type_id');
    $table->float('detection_limit', 10, 0);
    $table->smallInteger('books_classification_id');
    $table->smallInteger('books_number');
    $table->foreign(['books_classification_id', 'books_number'], 'fk_books__classification_scales')
        ->references(['calibration_id', 'number'])->on('classification')
        ->onUpdate('RESTRICT')->onDelete('RESTRICT');
});

Schema::create('classification', function (Blueprint $table) {
    $table->smallInteger('calibration_id');
    $table->smallInteger('number');
    $table->string('name', 50);
    $table->primary(['calibration_id', 'number'], 'pk_classification_scales');
    $table->foreign('calibration_id', 'fk_classification_calibration')->references('id')
        ->on('calibration_parameters')->onUpdate('CASCADE')->onDelete('CASCADE');
});

Как я могу установить связь в таблице «Книги», чтобы взять number и calibration_id?


person Cyril Jeanneret    schedule 20.03.2019    source источник
comment
Взгляните на этот пакет: github.com/topclaudy/compoships   -  person Jonas Staudenmeir    schedule 27.03.2019


Ответы (1)


Подобно книгам-классификациям, я покажу вам пример отношения между задачами-проектами (что является проектом этой задачи):

ЗАДАЧА

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('tasks', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->text('description');
        $table->string('name');
        $table->integer('project_id')->unsigned();
        $table->timestamp('start_date');
        $table->timestamp('end_date');
        $table->timestamps();

        $table->foreign('project_id')->references('id')->on('projects')->onDelete('cascade')->onUpdate('cascade');
    });
}

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

ПРОЕКТЫ

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('projects', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('description');
        $table->tinyInteger('active')->default(1);
        $table->timestamps();
    });
}

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

Я надеюсь, что это поможет вам, привет!

person J. Fdez    schedule 20.03.2019
comment
привет, спасибо за вашу помощь, но в вашем примере у вас нет составного внешнего ключа: это моя проблема. я могу использовать составной внешний ключ, и я думаю, что laravel красноречивый не может использовать это: S - person Cyril Jeanneret; 20.03.2019
comment
Ах хорошо! Я плохо тебя понял. Взгляните на эту ссылку: stackoverflow.com/questions/39736866/ - person J. Fdez; 21.03.2019