Laravel では、複数の主キーを持つテーブルをモデル化するときに問題が発生する可能性があります。デフォルトでは、Laravel モデルは「id」という名前の単一の主キーを想定しています。
複数の列でテーブルの行を一意に定義する複合主キーを処理するには、モデルをカスタマイズする必要があります。 。ただし、配列またはコンマ区切りの文字列を使用して主キーを定義することは、Model.php では機能しません。
この制限に対する解決策は、次のトレイトを使用することです。 :
namespace App\Model\Traits; // *** Adjust namespace to match your models *** use Illuminate\Database\Eloquent\Builder; trait HasCompositePrimaryKey { /** * Indicates if IDs are incrementing. * * @return bool */ public function getIncrementing() { return false; // Composite keys are not incrementing. } /** * Set 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) { // Add if isset() if (isset($this->$key)) { $query->where($key, '=', $this->$key); } else { throw new Exception('Missing part of primary key: ' . $key); } } return $query; } /** * Execute 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); } }
場所モデルの「Traits」ディレクトリ内の特性を取得し、複合キーを使用してモデルに追加します。
class MyModel extends Eloquent { use Traits\HasCompositePrimaryKey; // *** Use the trait *** /** * The primary key of the table. * * @var string */ protected $primaryKey = ['key1', 'key2']; ... }
以上がLaravel 5モデルで複合主キーを定義して使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。