首页 > 解决方案 > 如何在 laravel 模式构建器中创建 [anyType] 数组?

问题描述

假设我有一个用户模式,它将“爱好”链接到它,作为一个数组字符串。

我最近从 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

现在我想到了两个解决方案,一个是找到一种方法以某种方式将其实现为数组,或者,由于架构构建器不支持将数组类型放在这里,这不是我可以使用的最佳逻辑,我需要找到将我的“用户”模式添加到“爱好”数组的另一种方法。(我唯一能想到的就是创建一个“爱好”模式并使用雄辩的关系将它们绑定在一起,但这似乎不太实用)

标签: phpmysqlsqllaravelschema

解决方案


您可以创建一个 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',
    ];
}

正如另一个答案中提到的,关系数据库更常见的做法是创建一个额外的表来存储用户和爱好之间的关系。如果您需要任何排序、搜索、级联删除/更新等。创建多对多关系而不是存储为数组更实用。


推荐阅读