Dans Laravel, les tables avec plusieurs clés primaires peuvent poser un défi lors de leur modélisation. Par défaut, les modèles Laravel supposent une seule clé primaire nommée « id ».
Pour gérer les clés primaires composites, où plusieurs colonnes définissent les lignes du tableau de manière unique, nous devons personnaliser le modèle . Cependant, l'utilisation de tableaux ou de chaînes séparées par des virgules pour définir la clé primaire ne fonctionne pas dans Model.php.
Une solution à cette limitation consiste à utiliser le trait suivant :
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); } }
Placez le trait dans le répertoire "Traits" de vos modèles et ajoutez-le à n'importe quel modèle avec des clés composites :
class MyModel extends Eloquent { use Traits\HasCompositePrimaryKey; // *** Use the trait *** /** * The primary key of the table. * * @var string */ protected $primaryKey = ['key1', 'key2']; ... }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!