比方说,我有一个用户架构,该架构将以数组字符串的形式链接到“爱好”。
我最近从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不支持在此处放置数组类型,因此这不是我可以使用的最佳逻辑,我需要找到另一种将“用户”模式添加到“兴趣”数组的方法。 (我唯一能想到的就是创建一个“爱好”模式并使用雄辩的关系将它们绑定在一起,但这似乎不太实际)
答案 0 :(得分:0)
最好的方法是使用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);
}
您需要在两个表中相应地定义外键。此外,many-to-many relationship需要第三个表。在您的情况下,它将称为:hobby_user
要访问用户的爱好,只需执行以下操作即可:
App\User::find(1)->hobbies;
虽然您也可以将兴趣爱好另存为字符串(..或JSON),但以后如果要执行查询,报告或其他操作,可能会变得很麻烦。
答案 1 :(得分:0)
您可以创建一个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',
];
}
在另一个答案中提到,关系数据库的更常见做法是创建一个附加表来存储用户和兴趣爱好之间的关系。 如果您需要任何排序,搜索,级联删除/更新等操作,那么创建多对多关系而不是将其存储为数组会更加实用。
答案 2 :(得分:0)
您可以使用 json 字段(MySql开箱即用),
https://dev.mysql.com/doc/refman/5.7/en/json.html
在这里查看laravel文档:
https://laravel.com/docs/5.7/migrations
也许这对您也有帮助
答案 3 :(得分:0)
并非所有数据库系统中都存在数组数据类型。因此,您必须执行以下方法: 您可以像以下方式那样使用 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'
];
}