Как я могу сделать массив [anyType] в компоновщике схем laravel? - PullRequest
0 голосов
/ 28 января 2019

Допустим, у меня есть пользовательская схема, к которой будут привязаны «хобби» в виде строки массивов.

Недавно я переключился с MongoDB на SQL, поэтому моя первая мысль была похожа на нее, как на Mongo.и создайте что-то вроде этого;

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

Итак, я попытался реализовать ту же логику для построителя схем laravel, как этот;

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

Теперь я подумал о двух решениях, одно из которыхнайти способ как-то реализовать его как массив, или, поскольку schemabuilder не поддерживает размещение типа массива здесь, это не лучшая логика, которую я могу использовать, и мне нужно найти другой способ добавления моей "пользовательской" схемымассив "хобби".(Единственное, что я мог подумать, это создать схему «хобби» и использовать красноречивые отношения, чтобы связать их вместе, но это не кажется слишком практичным)

Ответы [ 4 ]

0 голосов
/ 28 января 2019

Тип данных массива присутствует не во всех системах баз данных.Таким образом, вы должны сделать следующий метод: Вы можете использовать метод json -> ('') следующим образом:

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

А затем ваше пользовательское свойство модели user как.

class User extends Model
{
    protected $xyz= [
    'hobbies' => 'array'
    ];
}
0 голосов
/ 28 января 2019

Вы можете создать столбец JSON для хранения массива.

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

Затем в модели вы можете привести этот столбец к массиву при каждом его автоматическом получении.

<?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',
    ];
}

Как уже упоминалось в другом ответе, более распространенной практикой в ​​реляционных базах данных является создание дополнительной таблицы для хранения отношений между пользователями и хобби.Если вам понадобится какая-либо сортировка, поиск, каскадное удаление / обновление и т. Д., Более практично создать отношение «многие ко многим», а не сохранять их в виде массива.

0 голосов
/ 28 января 2019

Вы можете использовать поле json (MySql поддерживает его из коробки),

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

см. Здесь документы по laravel:

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

может быть, это вам тоже поможет

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

0 голосов
/ 28 января 2019

лучший способ - использовать Eloquent Relationships .Я не уверен, почему это не будет практичным в вашем случае.

В вашем конкретном случае User может иметь много Hobby, а Hobby также может принадлежать многим User.

Вот как будут выглядеть ваши отношения:

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

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

Вам необходимо определить свои внешние ключи соответственно в двух ваших таблицах.Кроме того, для отношения «многие ко многим» требуется третья таблица.В вашем случае это будет называться: hobby_user

Чтобы получить доступ к хобби пользователя, вы просто должны сделать что-то вроде этого:

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

Хотя вы также можете сохранить хобби какСтрока (.. или JSON ), это может стать проблемой позже, если вы захотите делать запросы, составлять отчеты, а что нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...