【问题标题】:How to seed pivot table in Laravel 5.4?如何在 Laravel 5.4 中播种数据透视表?
【发布时间】:2017-09-19 03:47:33
【问题描述】:

我正在学习 Jeffrey Way 的 laracasts 中的增量 API 教程。

在 Laravel 4 faker 类播种和 laravel 5.4 之间存在不同的编码。

我仍然遵循教程“重载播种机”中的相同代码行。现在,我被“Class LessonTagTableSeeder 不存在”所困

TagTableSeeder

class TagsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {

        $faker = Faker::create('App\Tag');

        for($i=1; $i <= 10; $i++) {

            DB::table('tags')->insert([
                'name' => $faker->word,
                'created_at' => \Carbon\Carbon::now(),
                'updated_at' => \Carbon\Carbon::now(),

            ]);


        }


    }

LessonTagTableSeeder

use Illuminate\Database\Seeder;
use Faker\Factory as Faker;
use App\Lesson;
use App\Tag;

class LessonTagTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {

        $faker = Faker::create();

        $lessonIds = Lesson::pluck('id')->all();
        $tagIds = Tag::pluck('id')->all();

        for($i=1; $i <= 30; $i++) {

            DB::table('lesson_tag')->insert([
                'lesson_id' => $faker->randomElement($lessonIds),
                'tag_id' => $faker->randomElement($tagIds)
            ]);


        }


    }

数据库播种器

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use App\Lesson;
use App\Tag;
use DB;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {

        DB::statement('SET FOREIGN_KEY_CHECKS=0');
        Lesson::truncate();
        Tag::truncate();
        DB::table('lesson_tag')->truncate();

        Model::unguard();

        $this->call('LessonsTableSeeder');
        $this->call('TagsTableSeeder');
        $this->call('LessonTagTableSeeder');

        DB::statement('SET FOREIGN_KEY_CHECKS=1');

    }

我能够使用 php artisan db:seed --class=TagsTableSeeder

为 TagsTableSeeder 播种

当我运行 "php artisan db:seed --class=LessonTagTableSeeder" 时,系统提示我:

[反射异常] 类 LessonTagTableSeeder 不存在

你知道如何编辑上面的代码吗?任何帮助表示赞赏

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    当您对播种文件进行更改并且它没有反映您的更改时,您需要运行 composer dump autoload。

    您可以使用以下任一命令

    $ composer dump-autoload
    
    $ composer du
    
    $ composer dump
    
    
    $ composer dump-autoload -o
    

    然后尝试再次运行命令 db:seed,它会反映您的更改。

    composer dump autoload 做什么?

    composer dump-autoload 不会下载任何东西。它只是重新生成需要包含在项目中的所有类的列表(autoload_classmap.php)。非常适合在项目中有新课程时使用。

    理想情况下,您执行 composer dump-autoload -o ,以更快地加载您的网页。它不是默认的唯一原因是因为它需要更长的时间来生成(但只是稍微明显)

    【讨论】:

      【解决方案2】:

      确保文件名为LessonTagTableSeeder.php,并且与其他播种机位于同一目录中。然后运行这个命令:

      composer du
      

      然后尝试再次执行播种器。

      【讨论】:

        【解决方案3】:

        运行此命令,然后重试

        作曲家转储-自动加载-o

        【讨论】:

          【解决方案4】:
          Usually cache 
          
          php artisan cache:clear
          
          composer update
          
          php artisan serve
          

          【讨论】:

          • 请编辑您的答案以包含一些解释。仅代码的答案对教育未来的 SO 读者几乎没有作用。您的答案因质量低劣而在审核队列中。
          【解决方案5】:

          数据透视表或关联表是映射其他两个表之间关系的表,对于具有多对多关系的两个表非常有用。

          您为“DatabaseSeeder”提供了 3 行关键代码:

              $this->call('LessonsTableSeeder');
              $this->call('TagsTableSeeder');
              $this->call('LessonTagTableSeeder');
          

          根据您编写的内容,您只运行了“TagsTableSeeder”和“LessonTagTableSeeder”的命令。您错过了运行“LessonsTableSeeder”的命令。

          换句话说,您在“Tag”表中有记录,但在“Lesson”表中没有记录。因此,两个表之间没有关联的记录,SQL 无法创建空关联(数据透视)表。

          进一步说明,在创建关联表时,种子操作的执行顺序很重要。您必须在为其他两个表播种之后为关联表执行种子命令。关联表需要知道其他每个表中的唯一标识符才能创建关系。

          【讨论】:

            猜你喜欢
            • 2017-12-15
            • 2018-02-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-04
            • 2021-05-08
            • 2018-08-21
            • 2021-06-11
            相关资源
            最近更新 更多