2
votes

Comment puis-je créer un tableau de [anyType] dans laravel schema builder?

Disons que j'ai un schéma utilisateur, auquel seront liés des "hobbies", sous la forme d'une chaîne de tableaux.

J'ai récemment basculé de MongoDB vers SQL donc, ma première pensée a été de l'aborder comme Mongo, et de faire quelque chose comme ça;

Schema::create('users', function (Blueprint $table) {
      $table->string('username');
      $table->string('password');
      $table->array(string('hobbies'));  //array(string("test")) is just a mock syntax, I just researched how can I implement an array type here and learned that I can't

Donc, j'ai essayé d'implémenter la même logique au constructeur de schéma laravel comme ceci;

var userSchema = new mongoose.Schema({
    username: String,
    password: String,
    hobbies: [String] });

Maintenant, j'ai pensé à deux solutions, l'une est de trouver un moyen de l'implémenter en tant que tableau, ou, puisque le schemabuilder ne prend pas en charge la mise ici d'un type de tableau, ce n'est pas la meilleure logique que je puisse utiliser et j'ai besoin de trouver une autre façon d'ajouter mon schéma "utilisateur" à un tableau "hobbies". (La seule chose que je pouvais penser était de créer un schéma de "hobbies" et d'utiliser une relation éloquente pour les relier, mais cela ne semble pas trop pratique)


0 commentaires

4 Réponses :


0
votes

La meilleure façon serait d'utiliser des relations éloquentes a >. Je ne sais pas pourquoi cela ne sera pas pratique dans votre cas.

Dans votre cas particulier, un Utilisateur peut avoir de nombreux Hobby et un Hobby peut également appartenir à de nombreux User code >.

Voici à quoi ressembleraient vos relations:

App\User::find(1)->hobbies;

Vous auriez besoin de définir vos clés étrangères en conséquence dans les deux tables que vous avez. De plus, une relation plusieurs-à-plusieurs nécessite une troisième table. Dans votre cas, il s'appellerait: hobby_user

Pour accéder au passe-temps d'un utilisateur, vous devez simplement faire quelque chose comme ceci:

// in App\User.
public function hobbies()
{
    return $this->hasMany(Hobby::class);
}

// in App\Hobby
public function users()
{
    return $this->belongsToMany(User::class);
}

Bien que vous puissiez également enregistrer les loisirs sous forme de chaîne (.. ou JSON ), cela pourrait devenir un problème plus tard si vous souhaitez faire des requêtes, des rapports et autres.


0 commentaires

0
votes

Vous pouvez créer une colonne JSON pour stocker un tableau.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'hobbies' => 'array',
    ];
}

Ensuite, sur le modèle, vous pouvez convertir cette colonne en tableau à chaque fois que vous la récupérez automatiquement.

Schema::create('users', function (Blueprint $table) {
      $table->string('username');
      $table->string('password');
      $table->json('hobbies');

Comme mentionné dans une autre réponse, une pratique plus courante avec les bases de données relationnelles est de créer une table supplémentaire pour stocker la relation entre les utilisateurs et les loisirs. Si vous avez besoin d'un tri, d'une recherche, d'une suppression / mise à jour en cascade, etc., il est plus pratique de créer une relation plusieurs-à-plusieurs au lieu de la stocker sous forme de tableau.


2 commentaires

Tout d'abord, merci pour la réponse. Je pensais que créer un autre "passe-temps" de schéma / migration, puis les lier avec user> hasMany> passe-temps, mais créer un schéma avec une seule colonne (chaîne) semblait un peu étrange, alors je me suis dit "il y a probablement une meilleure façon même si cela marchera". Si vous dites que c'est un moyen idéal de résoudre ce problème, j'utiliserai la solution éloquente. À votre santé


Je vous en prie. Cela évite de nombreux problèmes, par exemple la duplication d'informations, ce qui conduit à un autre ensemble de problèmes. Par exemple. si les utilisateurs partagent le même passe-temps et que vous devez renommer ce passe-temps, vous devrez mettre à jour tous ces utilisateurs. Mais lorsque vous avez une table séparée pour les loisirs, il vous suffit de mettre à jour une ligne qui affectera tous les utilisateurs liés. Si vous venez de passer de la base de données NoSQL aux bases de données relationnelles, vous voudrez peut-être en savoir plus sur les modèles de conception de base de données, en particulier les pratiques de normalisation de base de données en.wikipedia.org/wiki/Database_normalization .



0
votes

Vous pouvez utiliser le champ json (MySql le prend en charge dès la sortie de la boîte),

https://dev.mysql.com/doc/refman /5.7/en/json.html

voir ici la documentation laravel:

https://laravel.com/docs/5.7/migrations

peut-être que cela vous aidera aussi

https://eloquentbyexample.com/course/lesson/lesson-9-json


0 commentaires

0
votes

Le type de données tableau n'est pas présent dans tous les systèmes de base de données. Vous devez donc suivre la méthode suivante: Vous pouvez utiliser la méthode json -> ('') comme suit:

class User extends Model
{
    protected $xyz= [
    'hobbies' => 'array'
    ];
}

Et puis votre propriété d'utilisateur de modèle user comme.

Schema::create('users', function (Blueprint $table) {
      $table->string('username');
      $table->string('password');
      $table->json('hobbies');


1 commentaires

Cela ne fonctionnera pas. Il n'y a pas de propriété $ xyz définie dans les modèles Laravel.