【问题标题】:Laravel Seeding Does not Fill in FieldsLaravel 播种不填充字段
【发布时间】:2013-05-06 00:52:41
【问题描述】:

我有一个数据库种子文件:

class ContactTableSeeder extends Seeder {
    public function run()
    {
        $contacts = array(
            array(
                'first_name'        => 'Test',
                'last_name'         => 'Contact',
                'email'             => 'test.contact@emai.com',
                'telephone_number'  => '0111345685',
                'address'           => 'Address',
                'city'              => 'City',
                'postcode'          => 'postcode',
                'position'          => 'Director',
                'account_id'        => 1
           )
        );

        foreach ($contacts as $contact) {
            Contact::create($contact);
        }
    }
}

当我运行 php artisan migrate:refresh --seed 时,它会为数据库播种并在联系人表中创建相关记录,但它不会使用种子数组中的任何信息填充字段。我对其他表使用完全相同的语法并且它们工作正常,并且我还彻底检查了每个字段以确保它们与数据库字段匹配,但无论我做什么都不会正确播种。

有人有什么想法吗?

【问题讨论】:

  • 您是否在模型中设置了 $fillable 或 $guarded 属性?如果没有,那么 Laravel 将不会让你使用 ::create() 方法填充字段,因为它是批量分配的。在这里查看 - laravel.com/docs/5.1/eloquent#mass-assignment

标签: laravel laravel-4 migrate seeding


【解决方案1】:

您是否尝试过替换以下行:

foreach ($contacts as $contact) {
   Contact::create($contact);
}

DB::table('contact')->insert($contacts);

假设您的表名是 contact。 另外,请确保您有这样的线路

$this->call('ContactTableSeeder');

在您的 DatabaseSeeder 类中。

【讨论】:

  • 我的表名是联系人。我应该能够使用 Eloquent 为数据库播种,就像我在其他种子中一样。
  • 当使用 DB::table('contacts').insert($contacts);它说调用未定义的函数 insert()。我正在使用 Laravel 4。
  • 我的回答有误。应该是 DB::table('contact')->insert($contacts);
  • OK 你的语法错误,应该是 DB::table('contacts')->insert($contacts);那行得通,那为什么 Eloquent 不起作用。
  • @Gaz - 批量分配保护可能会阻止它? four.laravel.com/docs/eloquent#mass-assignment
【解决方案2】:

您的 DatabaseSeeder 类的 run() 函数中有 $this->call("ContactTableSeeder") 吗?

如果您在自己的文件中有ContactTableSeeder,那么文件名为ContactTableSeeder.php 是否准确?如果不是,它将无法根据PSR-0 Standard. 加载

这是我最初的想法。

【讨论】:

  • 我刚刚编辑了我的一个种子文件以匹配您的语法,它工作正常,虽然我的文件名为TenantTableSeeder。你试过composer update 获取最新版本的 Laravel 4 吗?
  • 我在我的 DatabaseSeeder 类 run() 方法中调用 $this->call('ContactTableSeeder') 并且文件名是正确的。我还运行了 composer update 没有错误。唯一使用该语法的表是我的 users 表。
  • 问题不在于种子的调用甚至插入记录,它确实插入了它们,它们只是空的。
  • 如何在此处粘贴 DatabaseSeeder.php 文件的源代码:paste.laravel.com
  • 还有你的 Contact.php 和 ContactTableSeeder.php 文件吗?
【解决方案3】:

原来问题与我的模型中的关系有关。

对于这个问题的未来访问者:确保检查模型中定义 hasOne/hasMany/etc 关系的所有函数。阅读Eloquent docs 了解更多信息。

【讨论】:

  • 你能否更详细地解释一下你们的关系最终出了什么问题?
  • 我不记得很抱歉。我想可能是因为我没有设置 Contact 模型。
  • 我刚遇到这个问题。就我而言,我已将其添加到 User 模型中:public function user() { return $this->hasOne('Manager', 'userid'); } 但它应该是 manager() 函数。您只需要确保模型关系正确即可。
【解决方案4】:

我遇到了同样的问题,但上述解决方案均不适合我。原来是因为我的模型中有一个构造函数!在我删除它之后它工作正常!

public function __construct()
{
    parent::__construct();
}

编辑: 在进一步阅读之后,我发现这个问题是由于如果你要在你的模型中包含一个构造函数必须接受属性参数并将其传递给父级。如果您这样做,则构造函数不会破坏 DB 播种(可能还有其他事情)。我希望这可以避免其他人头疼。

public function __construct($attributes = array())
{
    parent::__construct($attributes);
}

【讨论】:

    猜你喜欢
    • 2013-06-02
    • 2019-03-26
    • 2012-01-22
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多