라라벨 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 업데이트
라라벨 트리츠는 죽었지만 어쨌든 코드를 즐겨보세요 :)
지난 몇 년 동안, 몇 가지 심층적인 사용 사례가 이 문제를 해결하는 데 도움이 되었습니다.이는 대부분의 사용 사례에서 효과적일 것입니다. 하지만 만약 여러분이 멋을 부려고 한다면 여러분의 접근 방식을 재고해야 할 수도 있습니다.
그럴수는 없어요.웅변술은 복합 기본 키를 지원하지 않습니다.
이것은 적어도 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
'programing' 카테고리의 다른 글
문자열로서의 Excel 셀 값은 문자열로 저장되지 않습니다. (0) | 2023.08.13 |
---|---|
JDBC에서 저장 프로시저를 호출하는 방법 (0) | 2023.08.13 |
오류: 리소스 Android:attr/fontVariationSettings를 찾을 수 없습니다. (0) | 2023.08.13 |
일시적인 데드존이란 무엇입니까? (0) | 2023.08.13 |
파이썬에서 0x 없이 hex()를 사용하는 방법은 무엇입니까? (0) | 2023.08.13 |