【问题标题】:Laravel Factory LogicLaravel 工厂逻辑
【发布时间】:2020-01-22 20:10:09
【问题描述】:

我在下面有工厂。当我将其设置为创建多个模型时,ID 似乎没有增加。请帮助我了解如何使此代码正常工作,以便 ID 每次递增。

<?php

/* @var $factory \Illuminate\Database\Eloquent\Factory */

use App\PurchaseOrder;
use Faker\Generator as Faker;
use Illuminate\Support\Facades\DB;

$factory->define(PurchaseOrder::class, function (Faker $faker) {

    DB::select(DB::raw('SET FOREIGN_KEY_CHECKS=0'));
    $numberOfLines = rand(1, 5);
    $id = PurchaseOrder::all()->last()->id + 1?? 1;

    for ($i = 0; $i < $numberOfLines; $i++) {
        $line = factory(App\Line::class)->make([
            'purchase_order_id' => $id,
        ]);
        $line->save();
    };

    $lines = App\Line::where('purchase_order_id', $id)->get();
    DB::select(DB::raw('SET FOREIGN_KEY_CHECKS=1'));
    return [
        'total_price_ex_vat' => $lines->sum('price_ex_vat'),
        'total_price_inc_vat' => $lines->sum('price_inc_vat'),
        'revised_total_price_ex_vat' => $lines->sum('revised_price_ex_vat'),
        'revised_total_price_inc_vat' => $lines->sum('revised_price_inc_vat'),
        'deliver_to' => $faker->words(2, true),
        'requested_staff_id' => factory(App\Staff::class)->create()->id ,
        'auth_staff_id' => Null,
        'supplier_id' => factory(App\Supplier::class)->create()->id,
        'rejection_code_id' => Null,
        'status_id' => 1,
        'status_changed_date' => date('Y-m-d'),
        'user_id' => factory(App\User::class)->create()->id,
    ];

});

【问题讨论】:

  • 你的主键是purchase_order_id还是id
  • @glenuk 最好你也向我们展示该表的迁移。
  • @RashedHasan 抱歉,我贴错了工厂。现在应该更有意义了。
  • 我相信你不应该先创建 Line。我的建议: 1. 首先创建 PurchaseOrder 2. 使用 afterCreating (laravel.com/docs/5.7/database-testing#factory-callbacks) 并在此方法中创建行这样您也可以删除 FOREIGN_KEY_CHECKS 行
  • 您有表 PurchaseOrder 依赖于 Lines,Lines 依赖于 PurchaseOrder。我相信你应该检查你的数据库设计,因为这看起来很奇怪。为什么不避免在 PurchaseOrder 中使用 Lines 并将其作为属性加载到带有访问器的 PurchaseOrder 模型中?

标签: php laravel factory


【解决方案1】:

您有表 PurchaseOrder 依赖于 Lines,而 Lines 依赖于 PurchaseOrder。我相信你应该检查你的数据库设计,因为这看起来很奇怪。

为什么不避免在 PurchaseOrder 中使用 Lines 并将其作为属性加载到带有访问器的 PurchaseOrder 模型中?

欲了解更多信息:https://laravel.com/docs/5.8/eloquent-mutators#defining-an-accessor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-27
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2017-05-29
    • 2014-10-24
    相关资源
    最近更新 更多