当前位置: 首页 > 知识库问答 >
问题:

Laravel播种与工厂但延长它

仇征
2023-03-14

我想要一个包含两个表Users和Companys的数据库,并且Users表有一个带有公司id的外键。因此一个公司可以有多个用户。

我在laravel中为此创建了模型,还为每个表创建了一个工厂。

在我的播种机中,我想一次创建多条数据线,并找到了以下解决方案:

factory(App\Company::class, 10)->create(); 

这对公司表很有用。但是我需要为users表扩展它,以便它搜索可用的公司id。
我知道怎么做吗?
如果我不能搜索可用id,我也很乐意用“company_id”字段扩展它,并给它1-10的随机值(因为我现在知道这些是id)。

所以基本上我想扩展它来使用工厂中的字段,但是用另一个字段“company_id”来扩展它:

factory(App\Users::class, 10)->create();

以下是用户出厂代码:

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'first_name' => $faker->firstName,
        'last_name' => $faker->lastName,
        'postcode' => $faker->postcode,
        'city' => $faker->city
    ];
});

共有3个答案

艾心远
2023-03-14

如果您使用的是Laravel 5.2或更高版本,您可以使用:

“公司id”=

边翔宇
2023-03-14

看起来是这样的,您希望创建CompanyUser,同时还希望将用户与公司连接起来。如果这是你想要实现的,那么你可以使用这样的东西轻松实现:

factory(App\Company::class, 10)->create()->each(function($factory) {
    $factory->users()->save(factory(App\User::class)->make());
});

在这种情况下,您必须使用右侧的外键公司模型中定义用户关系方法。

这将创建10个公司并返回一个集合,这样使用每个方法的集合将创建一个用户并与该公司连接。还有,检查留档。

督宏旷
2023-03-14

在处理此类关系时,定义模型工厂可能是一件痛苦的事情。不过你有一些选择。

如果您确定有一个通用的ID范围,您可以只生成一个随机的ID来使关系正常工作:

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        // ...
        'company_id' => rand(1, 10),
    ];
});

这是Laracast的屏幕广播推广的最广泛使用的方法:

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        // ...
        'company_id' => factory(App\Company::class)->create()->id,
    ];
});

或者,您也可以反过来在公司工厂中创建一个或多个用户。这样,您只需要在一个实体上运行factory()

从Laravel的5.2版本开始,您可以访问一个名为《随机序》的雄辩方法:

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        // ...
        'company_id' => Company::inRandomOrder()->first()->id,
    ];
});

5.2之前的Laravel版本的替代方案:

// Laravel 4.2.7 - 5.1:
User::orderByRaw("RAND()")->get();

// Laravel 4.0 - 4.2.6:
User::orderBy(DB::raw('RAND()'))->get();

// Laravel 3:
User::order_by(DB::raw('RAND()'))->get();

// Source: http://stackoverflow.com/a/13931676/65732
 类似资料:
  • 工厂-创建对象而不向客户机公开实例化逻辑,并通过公共接口引用新创建的对象。是工厂方法的简化版本 工厂方法-定义一个创建对象的接口,但让子类决定实例化哪个类,并通过公共接口引用新创建的对象。 抽象工厂-提供了创建相关对象家族的接口,而无需显式指定它们的类。 null

  • 本文向大家介绍Laravel 使用MySQL Dump播种,包括了Laravel 使用MySQL Dump播种的使用技巧和注意事项,需要的朋友参考一下 示例 遵循前面创建种子的示例。本示例使用MySQL Dump在项目数据库中播种表。必须在播种之前创建表。 $sql将成为users.sql转储的内容。转储应具有INSERT INTO语句。存储转储的位置将取决于您。在上面的示例中,它存储在项目目录中

  • 问题内容: 在生产环境中运行数据库种子脚本时,发生内存耗尽。 以下是我的种子脚本。 所以我要做的是在种子脚本上添加一个无限制的内容。 现在的问题是,当我运行脚本时,它将SQL脚本的内容(非常大)记录到终端中。 有没有一种在我的数据库种子内运行不占用大量内存的SQL转储的好方法?我现在所做的是手动运行它: 问题答案: 发生问题的原因是,使用Db :: unprepared时,它还将查询记录到lara

  • 我有一个Spring MVC 3.2应用程序,我需要在此Web服务中添加一个长轮询以进行实时聊天。我关注了这篇文章Spring MVC 3.2 Preview: Chat Sample。 TopicRestController: 现在的问题是: 当我调用“/{topicId}/updates”时,如果在30秒后没有任何答案,服务器返回错误500,如果有人写了一条消息,服务器返回正确的消息,但服务器

  • 我想通过聊天Id获得用户和组之间的聊天次数。但查询没有给出聊天次数。它是空白的。我在堆栈溢出(Laravel Elount groupBy()和count,Laravel get count of results Basin groupBy)中也看到过类似的问题,并使用了那些标记为正确但仍然没有得到所需结果的查询。 我使用以下查询: 我的表格结构如下: 结果是这样的: )

  • 我使用Laravel成功地安装了WebSocket,并使用了自己的实现。现在我想切换到Laravel Echo和Laravel Echo服务器。但是,经过几个小时的尝试和阅读我能找到的每一份文档后,我确实需要进一步的帮助。 触发事件时发生的情况:队列工作程序根据需要处理事件:“已处理:照亮\广播\广播事件”。但是在laravel echo服务器控制台和客户端上都不会发生任何事情。 一些信息: >