Cet article vous présente principalement les informations pertinentes sur la configuration de sous-tableaux pour les relations entre les modèles Laravel. L'article le présente en détail à travers un exemple de code. Il a une certaine valeur d'apprentissage de référence pour les études ou le travail de chacun. ça peut suivre Apprenons avec l’éditeur.
Qu'est-ce qu'Eloquent
Eloquent est un ORM, le nom complet est Object Relational Mapping, traduit par "object relational mapping" (si vous s'y référer uniquement. Il serait trop sous-estimé de le considérer comme une couche d'abstraction de bibliothèque de tableaux de couche d'abstraction de base de données). Ce qu'on appelle « l'objet » est ce que cet article appelle « Modèle » ; le mappage des relations d'objet est la relation entre les modèles. Document chinois : http://laravel-china.org/docs/eloquent#relationships
Citation
En développement actuel Sub -des bases de données et des tables sont souvent utilisées. Par exemple, la table utilisateur est divisée en 100 tables. À l'heure actuelle, l'interrogation des données nécessite la configuration de sous-tables. Par exemple, la classe Model de Laravel fournit la méthode setTable :
.
/** * Set the table associated with the model. * * @param string $table * @return $this */ public function setTable($table) { $this->table = $table; return $this; }
Ensuite, pour ajouter, supprimer, modifier et interroger la table de données, vous devez d'abord créer une nouvelle instance de modèle, puis définir le nom de la table. Par exemple :
(new Circle())->setTable("t_group_" . hashID($userid, 20)) ->newQuery() ->where('group_id', $request->group_id) ->update($attributes);
C'est très simple, alors comment mettre en place des sous-tableaux lorsque la relation entre des modèles tels que HasOne, HasMany, etc. utilise cette méthode ?
Je n'ai pas trouvé de bonne solution après avoir longtemps cherché. En prenant HasOne comme exemple, j'ai regardé la méthode d'implémentation de la fonction HasOne de la classe Model Il n'y a pas de place pour mettre la table. nom, j'ai donc dû copier la méthode HasOne et la modifier. Par exemple, remplacez-le par myHasOne, ajoutez le paramètre $table pour définir le nom de la table et appelez setTable une fois l'objet instancié, et cela fonctionnera comme prévu.
Le code est le suivant :
public function detail() { return $this->myHasOne(Circle::class, 'group_id', 'group_id', 't_group_' . hashID($this->userid, 20)); } public function myHasOne($related, $foreignKey = null, $localKey = null, $table) { $foreignKey = $foreignKey ?: $this->getForeignKey(); $instance = (new $related)->setTable($table); $localKey = $localKey ?: $this->getKeyName(); return new HasOne($instance->newQuery(), $this, $instance->getTable() . '.' . $foreignKey, $localKey); }
Je me demande si vous avez une manière plus élégante.
Recommandations associées :
Comment charger des bibliothèques de classes tierces dans Laravel
Implémentation de la fonction de recherche par le framework Laravel
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!