2017-10-24 2 views
0

Gegeben gegeben, dass ich die folgenden Tabellen:Seeding Pivot-Tabelle mit Laravel 5.5 Modellfabrik - mb_strtolower() erwartet Parameter 1 sein String, array

  • Benutzer
  • Fragen
  • Tags
  • QUESTION_TAG my pivot table with two fields: question_id & tag_id

und meine App \ Frage Modell hat die folgenden Beziehungen:

class Question extends Model 
{ 
    public function user() 
    { 
     return $this->belongsTo(User::class); 
    } 

    public function tags() 
    { 
     return $this->hasMany(Tag::class); 
    } 
} 

ich die folgenden Fabriken erstellt haben:

Datenbank/Fabriken/UserFactory.php

$factory->define(App\User::class, function (Faker $faker) { 
    static $password; 

    return [ 
     'name' => $faker->name, 
     'email' => $faker->unique()->safeEmail, 
     'password' => $password ?: $password = bcrypt('123456') 
    ]; 
}); 

Datenbank/Fabriken/QuestionFactory.php

$factory->define(App\Question::class, function (Faker $faker) { 
    static $user_id; 

    return [ 
     'user_id' => $user_id, 
     'subject' => $faker->sentence(15), 
     'body' => $faker->paragraph(10) 
    ]; 
}); 

Datenbank/Fabriken/TagFactory.php

$factory->define(App\Tag::class, function (Faker $faker) { 
    return [ 
     'name' => str_slug($faker->words(mt_rand(1, 2))), 
     'description' => $faker->sentence() 
    ]; 
}); 

Ich habe versucht, sie alle zusammen in meinem Blinddaten Seeder wie diese verwenden:

class DummyDataSeeder extends Seeder 
{ 
    public function run() 
    { 
     // Seed dummy users 
     factory(App\User::class, 10)->create()->each(function($user) 
     { 
      // With dummy questions 
      $user->questions()->saveMany(factory(App\Question::class, 10)->make()->each(function($question) 
      { 
       // With dummy tags 
       $question->tags()->sync(factory(App\Tag::class, 3)->make()); 
      })); 
     }); 
    } 
} 

Wenn ich die Seeder laufen, bekomme ich die folgende Fehler:

[ErrorException] mb_strtolower() expects parameter 1 to be string, array given

Ist dies in der Modellfabrik nicht möglich? Muss ich einen anderen Ansatz verwenden?

+1

Run Samen mit 'php Handwerker db: Samen -vvv' weitere Informationen über den Fehler zu sehen. Oder überprüfen Sie 'storage/logs/laravel.log' – ljubadr

+0

Danke, die Frage wird aktualisiert. – Latheesan

+0

Wenn Sie eine neue Frage haben, tun Sie dies bitte, anstatt sie zu ändern, nachdem die Leute geantwortet haben. –

Antwort

0

Ich glaube, Sie brauchen belongsToMany für Pivot-Tabelle verwenden

in Ihrer Frage Modell

public function tags() 
{ 
    return $this->belongsToMany(Tag::class,'question_tag','tag_id','question_id'); 
} 

gleiche mit Ihrem Tag Modell

public function questions() 
{ 
return $this->belongsToMany(Question::class,'question_tag','question_id','tag_id'); 
} 

auch, müssen Sie

ändern
$question->tags()->sync(factory(App\Tag::class, 3)->make()); 

zu

$tags = factory(App\Tag::class, 3)->make(); 
$tagIds = Tag::select('id')->get()->toArray(); 
$question->tags()->sync($tagIds); 

das heißt, Sie IDs in Sync Argument übergeben müssen.

+0

Ich habe das versucht und ich bekomme immer noch den gleichen Fehler. – Latheesan

+0

Können Sie Ihre Benutzer-, Frage- und Tag-Modelle teilen? –

+0

können Sie auch versuchen, von Make zu ändern, um in Dummy-Fragen Zeile $ user-> Fragen() -> saveMany (Factory (App \ Question :: Klasse, 10) -> create() -> jeder (Funktion ($ question) –

0

Von fzaninotto/Faker readme:

words($nb = 3, $asText = false) // array('porro', 'sed', 'magni').

kehrt Array

Laravel str_slug()

The str_slug function generates a URL friendly "slug" from the given string: $slug = str_slug('Laravel 5 Framework', '-');

str_slug erwartet String

In Ihrer Datenbank/Fabriken/TagFactory.php müssen Sie die Linie beheben:

'name' => str_slug($faker->words(mt_rand(1, 2))), 

zu

'name' => str_slug(implode(' ', $faker->words(mt_rand(1, 2)))), 

oder vielleicht

'name' => str_slug($faker->sentence(mt_rand(1, 2))), 
+0

Okay, der Fehler wurde durch die falsche faker Verwendung verursacht, nicht die Migration, das habe ich korrigiert Es ist in meiner Fabrik so: ''name' => str_slug ($ faker-> words (mt_rand (1, 2), true), '-'),' - jetzt bekomme ich einen anderen Fehler: 'Call to undefined Methode Illuminate \ Database \ Query \ Builder :: sync() ' – Latheesan

+0

@Latheesan - Ich beantwortete die ursprüngliche Frage (bevor es bearbeitet wurde), aber Sie sollten vermeiden, die Frage zu ändern, nachdem Sie die Antwort erhalten. Am besten wäre es, eine neue Frage zu stellen. – ljubadr

Verwandte Themen