Untuk pengujian saya (Laravel 6), saya mencoba menggunakan pabrik dengan make(), untuk melewati operasi DB hanya dengan membuat contoh model baru.

Sekarang, saya mengalami sakit kepala untuk membuat segala sesuatunya bekerja dengan hubungan satu ke banyak saya.

Kerangka kode saya hanya untuk mendapatkan gambaran umum:

class Fine extends Model {
    // Other things here

    public function articles()
    {
        return $this->hasMany('App\Model\Article');
    }
}

Di mana Article tidak memiliki hubungan lain.

Sekarang, saya ingin membuat pabrik Fine untuk membuat sebuah instance di mana saya dapat mengurai $fine->articles, semuanya tanpa interaksi database.

Inilah pabrik Fine dasar yang berfungsi (tanpa menggunakan artikel):

$factory->define(Fine::class, function (Faker $faker) {
    return [
        "id" => 10,
        Fine::FIELDONE => 'xxx',
        Fine::FIELDTWO => 'yyy',
    ];
});

Yang saya gunakan dengan  $fine = factory(Fine::class)->make(); .

Sekarang saya perlu "mengisi" artikel. Saya telah mencoba dengan  hydrate() tetapi tidak berhasil. Saya telah mencoba dengan afterMaking() dengan berbagai kombinasi kode:

$factory->afterMaking(Fine::class, function (Fine $fine, Faker $faker) {
    $articles = factory(\App\Model\Article::class, 3)->make([\App\Model\Article::FINE_ID => $fine->id]);
    // TEST WITH SAVEMANY: $fine->saveMany(factory(\App\Model\Article::class, 10)->make());
    // SAME WITH CREATEMANY
    // TEST WITH HYDRATE: $multa->articles()->hydrate([$article]);
    // $multa->load('articles');
});

Hanya untuk menegaskan bahwa saya telah mencoba jalan yang berbeda tetapi, saya akui, saya agak tersesat.

Pada dasarnya saya berakhir dengan klasik

Illuminate\Database\QueryException: SQLSTATE[42S02]: Tabel atau tampilan dasar tidak ditemukan

Error, jadi saya masih mengakses database.

Sekarang, saya mulai berpikir bahwa pabrik adalah pilihan yang tepat hanya jika pada akhirnya akan menyimpan data di database (saya yakin saveMany() akan berfungsi jika saya menggunakan create() dan bukan make()).

Bisakah Anda memberi saya petunjuk tentang cara menyelesaikan tugas ini? Jika pabrik bukanlah cara yang tepat untuk melakukannya, saya lebih dari terbuka untuk mengubah pilihan saya juga.

Terima kasih sebelumnya! Lorenzo

0
Lorenzo S 19 November 2020, 12:43

1 menjawab

Jawaban Terbaik

Anda dapat mengatur informasi ini pada contoh model yang tidak ada jika Anda benar-benar harus:

$fine->setRelation(
    'articles', 
    factory(\App\Model\Article::class, 3)->make()
)

Itu tergantung apa yang Anda rencanakan untuk dilakukan dengan model ini dan hubungannya karena tidak ada ID yang ditetapkan sehingga mereka tidak benar-benar terkait dengan cara itu.

0
lagbox 19 November 2020, 10:08