Php Laravel尝试为未请求的列添加种子

Php Laravel尝试为未请求的列添加种子,php,laravel,seeding,laravel-seeding,Php,Laravel,Seeding,Laravel Seeding,我有一个奇怪的问题,在stackoverflow上搜索了一个小时,却没有找到解决办法。发生的情况是,当我尝试为一个表设定种子(出于安全目的,我们称之为my_table)时,种子程序似乎试图填充我从未要求设定种子的列 因此,首先,我运行php artisan migrate,使用以下迁移创建我的表: <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; us

我有一个奇怪的问题,在stackoverflow上搜索了一个小时,却没有找到解决办法。发生的情况是,当我尝试为一个表设定种子(出于安全目的,我们称之为
my_table
)时,种子程序似乎试图填充我从未要求设定种子的列

因此,首先,我运行
php artisan migrate
,使用以下迁移创建我的表:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMyTableTable extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('my_table', function (Blueprint $table) {
            $table->increments('id');

            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('user');

            $table->tinyInteger('from_default')->nullable(false)->default(7);
            $table->tinyInteger('to_default')->nullable(false)->default(20);
            $table->timestamps();

            $table->unique('user_id');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('my_table', function (Blueprint $table) {
            $table->dropUnique(['user_id']);
            $table->dropForeign(['user_id']);
        });
    }
}
因此,您可以看到该表是使用迁移文件中所需的确切字段创建的。因此,现在我想使用以下种子为该表设定种子:

<?php

use App\DomainLogic\Models\MyTable;
use App\DomainLogic\Models\User;
use Faker\Factory as FakerFactory;
use Illuminate\Database\Seeder;

class MyTableTableSeeder extends Seeder
{
    /**
     * @var array list of MyTable Users
     */
    private $myTableUsers = [];

    /**
     * Run the database seeds.
     */
    public function run()
    {
        $this->createMyTableUsers();
        $myTableUsers = $this->getMyTableUsers();
        foreach ($myTableUsers as $myTableUser) {
            factory(MyTable::class)->create([
                'user_id' => $myTableUser->getKey(),
                'from_default' => 7,
                'to_default' => 20,
            ]);
        }
    }

    private function getMyTableUsers(): array
    {
        return $this->myTableUsers;
    }

    private function createMyTableUsers()
    {
        $faker = FakerFactory::create();

        // My table
        $this->myTableUsers[] = factory(User::class)->create([
            'id' => 2,
            'first_name' => 'Kalle',
            'last_name' => 'Andersson',
            'email' => 'kalle.andersson@email.com',
            'password' => bcrypt('password', ['rounds' => 4]),
            'mobile_number' => $faker->e164PhoneNumber,
        ]);
        $this->myTableUsers[] = factory(User::class)->create([
            'id' => 3,
            'first_name' => 'Johan',
            'last_name' => 'Petterson',
            'email' => 'johan.petterson@email.com',
            'password' => bcrypt('password', ['rounds' => 4]),
            'mobile_number' => $faker->e164PhoneNumber,
        ]);
        $this->myTableUsers[] = factory(User::class)->create([
            'id' => 4,
            'first_name' => 'Krister',
            'last_name' => 'Johansson',
            'email' => 'krister.johansson@email.com',
            'password' => bcrypt('password', ['rounds' => 4]),
            'mobile_number' => $faker->e164PhoneNumber,
        ]);
        $this->myTableUsers[] = factory(User::class)->create([
            'id' => 5,
            'first_name' => 'Daniel',
            'last_name' => 'Eriksson',
            'email' => 'daniel.eriksson@email.com',
            'password' => bcrypt('password', ['rounds' => 4]),
            'mobile_number' => $faker->e164PhoneNumber,
        ]);
    }
}
奇怪的是,在我看来,我从来没有尝试过填充一个名为
starts\u day\u default
ends\u day\u default
的列。因为这些列不存在,也不应该存在。实际情况是,这些列被重命名为
start\u day\u default->from\u default
ends\u day\u default->to\u default
。用户创建正确,我可以在users表中看到它们,所以这不是问题所在。这也是我的MyTable模型:

<?php

namespace App\DomainLogic\Models;

use DateTimeImmutable;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;

class MyTable extends Model
{
    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false;
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'my_table';

    /**
     * Creates personal trainer, if personal trainer with id exists.
     *
     * @param int $myTableId
     *
     * @return null|self
     */
    public static function createFromId(int $myTableId): ?self
    {
        $myTable = self::select('my_table.*')
            ->join('user', 'user.id', '=', 'my_table.user_id')
            ->where('my_table.id', '=', $myTableId)
            ->whereNull('user.anonymized_at')
            ->get()
            ->first();

        return $myTable;
    }

    /**
     * Create personal trainer, if user_id exists.
     *
     * @param int $userId
     *
     * @return null|MyTable
     */
    public static function createFromUserId(int $userId): ?self
    {
        return self::where('user_id', $userId)->get()->first();
    }

    /**
     * Gets all personal trainers.
     *
     * @param bool $active
     *
     * @return Collection
     */
    public static function getMyTables(bool $active = null): Collection
    {
        $query = self::select('my_table.*')
            ->join('user', 'user.id', '=', 'my_table.user_id')
            ->whereNull('user.anonymized_at');

        if (isset($active)) {
            $query->where('user.active', '=', $active);
        }

        $myTables = $query->get();

        return $myTables;
    }

    /**
     * Gets user.
     */
    public function getUser(): User
    {
        $user = $this->belongsTo(User::class, 'user_id', 'id')->getResults();

        return $user;
    }

    /**
     * Check if personal trainers ids are valid.
     *
     * @param array $myTableIds
     *
     * @return bool
     */
    public static function areMyTableIdsValid(array $myTableIds): bool
    {
        $dbMyTableIds = self::select('my_table.id')
            ->join('user', 'user.id', '=', 'my_table.user_id')
            ->whereIn('my_table.id', $myTableIds)
            ->whereNull('user.anonymized_at')
            ->get()
            ->pluck('id')
            ->toArray();

        $dbMyTableIds = array_map('intval', $dbMyTableIds);
        sort($myTableIds);
        sort($dbMyTableIds);

        $result = false;
        if ($myTableIds === $dbMyTableIds) {
            $result = true;
        }

        return $result;
    }
}
建议加入,但没有帮助。我已经删除了所有的表,并重新运行了
php-artisan-migrate
,但这也没有帮助


我以前从未见过这种情况,所以我的问题是,有人能看到我的问题是什么吗?

最终解决了它,我错过了一个工厂文件
MyTableFactory
,其中仍然包含有错误的列。该文件非常隐蔽。

在我的例子中,该文件位于数据库/工厂中。我建议任何有相同问题的人搜索其名称中包含
Factory
的所有文件,然后在每个找到的文件中搜索导致问题的列

您是否尝试过php artisan migrate:refresh--seed@MattJameson是的,我尝试过。我终于找到了解决办法,看看我的答案。
In Connection.php line 664:

  SQLSTATE[42S22]: Column not found: 1054 Unknown column 'starts_day_default' in 'field list' (SQL: insert into `my_table` (`user_id`, `starts_day_default`, `ends_day_default`, `from_default`, `to_default`) values (2, 07, 20, 7, 20))

In PDOConnection.php line 82:

  SQLSTATE[42S22]: Column not found: 1054 Unknown column 'starts_day_default' in 'field list'

In PDOConnection.php line 80:

  SQLSTATE[42S22]: Column not found: 1054 Unknown column 'starts_day_default' in 'field list'
<?php

namespace App\DomainLogic\Models;

use DateTimeImmutable;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;

class MyTable extends Model
{
    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false;
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'my_table';

    /**
     * Creates personal trainer, if personal trainer with id exists.
     *
     * @param int $myTableId
     *
     * @return null|self
     */
    public static function createFromId(int $myTableId): ?self
    {
        $myTable = self::select('my_table.*')
            ->join('user', 'user.id', '=', 'my_table.user_id')
            ->where('my_table.id', '=', $myTableId)
            ->whereNull('user.anonymized_at')
            ->get()
            ->first();

        return $myTable;
    }

    /**
     * Create personal trainer, if user_id exists.
     *
     * @param int $userId
     *
     * @return null|MyTable
     */
    public static function createFromUserId(int $userId): ?self
    {
        return self::where('user_id', $userId)->get()->first();
    }

    /**
     * Gets all personal trainers.
     *
     * @param bool $active
     *
     * @return Collection
     */
    public static function getMyTables(bool $active = null): Collection
    {
        $query = self::select('my_table.*')
            ->join('user', 'user.id', '=', 'my_table.user_id')
            ->whereNull('user.anonymized_at');

        if (isset($active)) {
            $query->where('user.active', '=', $active);
        }

        $myTables = $query->get();

        return $myTables;
    }

    /**
     * Gets user.
     */
    public function getUser(): User
    {
        $user = $this->belongsTo(User::class, 'user_id', 'id')->getResults();

        return $user;
    }

    /**
     * Check if personal trainers ids are valid.
     *
     * @param array $myTableIds
     *
     * @return bool
     */
    public static function areMyTableIdsValid(array $myTableIds): bool
    {
        $dbMyTableIds = self::select('my_table.id')
            ->join('user', 'user.id', '=', 'my_table.user_id')
            ->whereIn('my_table.id', $myTableIds)
            ->whereNull('user.anonymized_at')
            ->get()
            ->pluck('id')
            ->toArray();

        $dbMyTableIds = array_map('intval', $dbMyTableIds);
        sort($myTableIds);
        sort($dbMyTableIds);

        $result = false;
        if ($myTableIds === $dbMyTableIds) {
            $result = true;
        }

        return $result;
    }
}
php artisan view:clear

php artisan cache:clear

php artisan debugbar:clear

composer dump-autoload