programing

라라벨 5의 모델에 복합 키를 넣으려면 어떻게 해야 합니까?

yellowcard 2023. 8. 13. 09:38
반응형

라라벨 5의 모델에 복합 키를 넣으려면 어떻게 해야 합니까?

데이터베이스에 두 개의 기본 키(id 및 language_id)가 있는 테이블이 있는데 이 테이블을 모델에 넣어야 합니다.모델(모델)의 기본 기본 키입니다.Laravel 5)의 php는 id이며, 기본 Keys가 id와 id_language가 되기를 원합니다.배열과 함께 넣거나 문자열과 ','를 함께 넣으려고 했지만 작동하지 않습니다.String에서 배열을 변환할 수 없다고 표시됩니다.

다음과 같은 간단한 PHP 특성을 작성하여 합성 키를 처리할 수 있도록 웅변술을 적용했습니다.

<?php

namespace App\Model\Traits; // *** Adjust this to match your model namespace! ***

use Illuminate\Database\Eloquent\Builder;

trait HasCompositePrimaryKey
{
    /**
     * Get the value indicating whether the IDs are incrementing.
     *
     * @return bool
     */
    public function getIncrementing()
    {
        return false;
    }

    /**
     * Set the keys for a save update query.
     *
     * @param  \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    protected function setKeysForSaveQuery(Builder $query)
    {
        foreach ($this->getKeyName() as $key) {
            // UPDATE: Added isset() per devflow's comment.
            if (isset($this->$key))
                $query->where($key, '=', $this->$key);
            else
                throw new Exception(__METHOD__ . 'Missing part of the primary key: ' . $key);
        }

        return $query;
    }

    // UPDATE: From jessedp. See his edit, below.
    /**
     * Execute a query for a single record by ID.
     *
     * @param  array  $ids Array of keys, like [column => value].
     * @param  array  $columns
     * @return mixed|static
     */
    public static function find($ids, $columns = ['*'])
    {
        $me = new self;
        $query = $me->newQuery();
        foreach ($me->getKeyName() as $key) {
            $query->where($key, '=', $ids[$key]);
        }
        return $query->first($columns);
    }
}

그것을 a에 배치합니다.Traits기본 모델 디렉토리 아래에 있는 디렉토리에서 복합 키 모델의 맨 위에 간단한 한 줄을 추가할 수 있습니다.

class MyModel extends Eloquent {
    use Traits\HasCompositePrimaryKey; // *** THIS!!! ***

    /**
     * The primary key of the table.
     * 
     * @var string
     */
    protected $primaryKey = array('key1', 'key2');

    ...


addded by jessedp:
This worked wonderfully for me until I wanted to use Model::find ... so the following is some code (that could probably be better) that can be added to the hasCompositePrimaryKey trait above:

protected static function find($id, $columns = ['*'])
{
    $me = new self;
    $query = $me->newQuery();
    $i=0;

    foreach ($me->getKeyName() as $key) {
        $query->where($key, '=', $id[$i]);
        $i++;
    }

    return $query->first($columns);
}

2016-11-17 업데이트

저는 지금 라라벨 트리츠라는 오픈 소스 패키지의 일부로 이것을 유지하고 있습니다.

2020-06-10 업데이트

라라벨 트리츠는 죽었지만 어쨌든 코드를 즐겨보세요 :)

지난 몇 년 동안, 몇 가지 심층적인 사용 사례가 이 문제를 해결하는 데 도움이 되었습니다.이는 대부분의 사용 사례에서 효과적일 것입니다. 하지만 만약 여러분이 멋을 부려고 한다면 여러분의 접근 방식을 재고해야 할 수도 있습니다.

그럴수는 없어요.웅변술은 복합 기본 키를 지원하지 않습니다.

이것과 관련된 Github 이슈가 있습니다.

이것은 적어도 Laravel 5.1과 함께 작동하기 때문에 바뀐 것 같습니다.

$table->primary(['key1', 'key2']);

마이그레이션만 실행하면 데이터베이스에 표시되는 내용이 위에 코드로 입력한 내용과 일치합니다(물론 위의 이름 필드는 프레젠테이션용입니다).

업데이트: 마이그레이션의 경우에도 마찬가지이지만 웅변을 통해 삽입하려는 즉시 합성 키와 함께 작동하지 않으며(마지막 항목) 절대 작동하지 않습니다.

https://github.com/laravel/framework/issues/5517

마이그레이션에서 테이블에 대한 복합 기본 키를 단순히 @erick-suarez 및 @sba가 다음과 같이 정의할 수 있습니다.Schema::create또는Schema::table 쓰기 록기쓰블$table->primary(['key1', 'key2']);

테이블을 나타내는 Mandwell 모델에서는 Mandwell 방법과 같은 복합 키를 직접 사용할 수 없습니다.find($key)도 아니다save($data) 보 을 사 모 인 있 수 검 니 습 다 할 색 를 스 턴 스 델 위 기 용 하 여 그 ▁for 다 니 ▁but ▁the ▁using ▁purposes 습 ▁instance ▁still ▁retrieve ▁model ▁viewing ▁you ▁can 있 러

$modelObject = ModelName::where(['key1' => $key1, 'key2' => $key2])->first();

만약 이 그 표의 , 은 그고해테레업를코사수있다습니용할면려데하를 사용할 수 .QueryBuilder다음과 같은 방법:

ModelName::where(['key1' => $key1, 'key2' => $key2])->update($data);

에▁where디$data당신이 당신의 모델을 업데이트하고 싶은 데이터 연관 배열은 다음과 같습니다.['attribute1' => 'value1', ..].


참고: 이러한 모델은 일반적으로 다대다 관계 구조를 깨는 피벗 테이블로 사용되기 때문에 이러한 모델을 검색할 때 Murpendel 관계를 안전하게 사용할 수 있습니다.

저에게 적합한 간편한 솔루션(Laravel 5.7):

모델에서 기본 키 중 하나를 정의합니다.

class MyTable extends Model
{
        protected $primaryKey = 'user_id';
        protected $table = 'my_table';
        protected $fillable = ['user_id', 'post_id', 'flag'];

두 기본 키를 모두 컨트롤러전달합니다. 여기서는 두 매개 변수 중 첫 번째에 사용했습니다.updateOrCreate두 개의 배열을 수신하는 메서드:

컨트롤러:

public function post_foo(Request $request)
{
//PK1 is user_id, PK2 is post_id
//flag - is the field that has its value changed

$task = MyTable::updateOrCreate(
    ['user_id' => $request->header('UID'),'post_id' => $request->input('post_id')],
    ['user_id' => $request->header('UID'),'post_id' => $request->input('post_id'),'flag' => $request->input('flag')]
    );
    return $task;
}

솔루션 설명:

당신이 가지고 있지 않은 문제.id열 기본 키가 모델에서 하나의 기본 키로 해결되면 컨트롤러에서 두 개의 기본 키로 DB의 올바른 행을 찾습니다.

다음 모듈을 사용해 볼 수 있습니다.

https://github.com/maksimru/composite-primary-keys

HasCompositePrimaryKey 특성을 모델에 추가하고 배열 값을 기본 키로 지정하기만 하면 됩니다.

<?php

use Illuminate\Database\Eloquent\Builder;

class YourModel extends Model 
{
    protected function setKeysForSaveQuery(Builder $query)
    {
        $query
            ->where('key1', '=', $this->getAttribute('key1'))
            ->where('key2', '=', $this->getAttribute('key2'));

        return $query;
    }
    
}

CK와의 많은 관계를 삽입하려면 이 문서를 참조하십시오.

https://laravel.com/docs/5.2/eloquent-relationships#inserting-many-to-many-relationships

편집: 추가 정보
설명서에서 볼 수 있듯이 연결 및 분리 기능은 CK 중간 테이블에 필요한 링크를 생성합니다.따라서 직접 생성할 필요가 없습니다;)

당신의 경우라면.model->languages()->attach(language_id)

https://laravel.com/docs/5.3/migrations#columns

네, 가능합니다.

마이그레이션 코드 공유:

    <?php

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

class RegistroEmpresa extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('registro_empresa', function(Blueprint $table)
        {
            $table->string('licencia',24);
            $table->string('rut',12);
            $table->string('nombre_empresa');
            $table->string('direccion');
            $table->string('comuna_Estado');
            $table->string('ciudad');
            $table->string('pais');
            $table->string('fono');
            $table->string('email');
            $table->string('paginaweb');
            $table->string('descripcion_tienda');
            $table->string('monedauso');
            $table->timestamps();
            $table->primary(['licencia', 'rut']);
        });
    }

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

}

언급URL : https://stackoverflow.com/questions/31415213/how-i-can-put-composite-keys-in-models-in-laravel-5

반응형