首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用实例方法时,工厂Muffin关系为"null“。

当使用实例方法时,工厂Muffin关系为"null“。
EN

Stack Overflow用户
提问于 2015-05-12 22:58:14
回答 1查看 396关注 0票数 0

我正在使用jenssegers\laravel-mongodb软件包开发一个Laravel 5应用程序,我正在尝试与工厂Muffin一起运行,以帮助快速测试和播种等等。

我在工厂定义中定义了关系(下面的代码)--当我运行种子在数据库中创建新记录时,它们可以工作。所谓“工作”,是指它们正确地将相关数据附加到父模型,并将所有这些记录持久化到数据库。但是,当我运行$muffin->instance('My\Object')方法时,它们不能工作,该方法创建了一个新实例,而没有持久化它。所有的关系都是无效的。

从某种意义上讲,这是合理的。当模型存储在数据库中时,它们由对象_id键关联。在存储模型之前,该密钥不存在。所以当我调用instance方法时,我实际上可以通过调试看到它确实生成了相关的模型,但是它还没有任何键来建立关系,所以数据就会变得非常重要。

这是一个令人沮丧的原因,因为我希望能够生成一个完全充实的模型及其关系,例如,当我将它的数据提交给我的路线和东西时,看看它是否被保存或通过验证等等。也就是说,现在我无法检查联系人的电子邮件是否有效,等等。

简化的代码示例如下--我是不是完全错误地这样做了?这是我第一次与蒙戈和穆芬工厂合作。这能按我想的方式运作吗?

代码语言:javascript
复制
// factories/all.php
$fm->define('My\Models\Event', [
    'title' => Faker::text(75),
    'contact' => 'factory|My\Models\Contact'
]);

$fm->define('My\Models\Contact', [
    'first_name' => Faker::firstName(),
    'email' => Faker::email(),
    ... etc
]);

// EventControllerTest.php
...

/**
 * @var League\FactoryMuffin\FactoryMuffin
 */     
protected $muffin;

public function setUp()
{
    parent::setUp();
    $this->muffin = new FactoryMuffin();
    $this->muffin->loadFactories(base_path('tests/factories'));
}

...

public function testCanStoreEvent()
{
    $event = $this->muffin->instance('Quirks\Models\Event');
    echo $event->contact; // returns null
    $event_data = $event->toArray();

    $this->call('POST', 'events', $event_data);
    $retrieved_event = Event::where('title', '=', $event->title)->get()->first();

    $this->assertNotNull($retrieved_event); // passes
    $this->assertRedirectedToRoute('events.edit', $retrieved_event->id); // passes


    // So, the event is persisted and the controller redirects etc
    // BUT, related data is not persisted
}
EN

回答 1

Stack Overflow用户

发布于 2015-05-13 17:21:39

好的,为了让工厂的松饼能够很好地充实芒果的嵌入关系,你必须这样做:

代码语言:javascript
复制
// factories/all.php

$embedded_contact = function() {
    $definitions = [
        'first_name' => Faker::firstName(),
        'email' => Faker::email(),
        // ... etc
    ];

    return array_map(
        function($item) { return $item(); },
        $definitions
    );
}

$fm->define('My\Models\Event', [
    'title' => Faker::text(75),
    'contact' => $embedded_contact
]);

如果这听起来又麻烦又烦人..。我同意!我很想知道更简单的方法来解决这个问题。现在,我正在继续上面的工作,它正在进行测试和播种。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30202845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档