はじめLaravel:私は名前のモデルを持っている</p> <p><strong>背景</strong></p> <p>:偽物
何アップの人々、私は、モデル工場と複数の独特の列についての質問を得ました画像。このモデルは、言語サポートが別のモデルImageTextに格納されています。 ImageTextは、image_idカラム、言語カラム、テキストカラムを持ちます。
ImageTextは組み合わせimage_idはと言語はユニークである必要がありにおける制約のMySQLを持っています。
class CreateImageTextsTable extends Migration
{
public function up()
{
Schema::create('image_texts', function ($table) {
...
$table->unique(['image_id', 'language']);
...
});
}
...
は今、私は播種が行われた後、いくつかのImageTextモデルを持っている各画像をしたいです。これは、モデル工場とこのシーダと簡単です:この使用したモデル工場と偽物を播種する場合ただし、あなたが頻繁にこのメッセージが残され
factory(App\Models\Image::class, 100)->create()->each(function ($image) {
$max = rand(0, 10);
for ($i = 0; $i < $max; $i++) {
$image->imageTexts()->save(factory(App\Models\ImageText::class)->create());
}
});
問題
:
[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '76-gn' for key 'image_texts_image_id_language_unique'
これは、ある時点ではforループの中で、fakerは['image_id'、 'language']の一意性制約を破って、同じlanguageCodeを画像に対して2回ランダム化するからです。
$factory->define(App\Models\ImageText::class, function (Faker\Generator $faker) {
return [
'language' => $faker->unique()->languageCode,
'title' => $faker->word,
'text' => $faker->text,
];
});
をしかし、その後、あなたの代わりに十分なimageTextsが作成された後に偽物がlanguageCodesを使い果たすという問題を得る:
あなたはこれを言うためにあなたのImageTextFactoryを更新することができます。
現在のソリューション
これは現在つlanguageCodesの一意のカウンタをリセットし、シーダーがするのループに入る前に、TE固有のカウンタをリセット工場を呼び出すImageText、2つの異なる工場を有することによって解決されます。さらにImageTextを作成します。しかし、これはコードの重複であり、これを解決するより良い方法があるはずです。
質問
あなたは工場出荷時に上の保存されているモデルを送信する方法はありますか?もしそうなら、現在のImageに既にImageTextが添付されているかどうかを確認するために工場内のチェックをすることができます。そうでない場合は、languageCodesの一意のカウンタをリセットします。
$factory->define(App\Models\ImageText::class, function (Faker\Generator $faker) {
$firstImageText = empty($image->imageTexts());
return [
'language' => $faker->unique($firstImageText)->languageCode,
'title' => $faker->word,
'text' => $faker->text,
];
});
もちろん、現在提供します:
[ErrorException]
Undefined variable: image
それが何らかの形でこれを達成することが可能である私の目標は、このようなものになるだろうか?