in my laravel app I created a polls system where users can vote, I achieved this with hasManyThrough relationship.
When I create one or multiple polls (from seeder or public method) I get the following error:
PHP Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 20480 bytes) in /Users/gabriel/Desktop/proyectos/laraapp.com/vendor/monolog/monolog/src/Monolog/Logger.php on line 350
PHP Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 20480 bytes) in /Users/gabriel/Desktop/proyectos/laraapp.com/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php on line 203
I even changed PHP memory_limit to 1024 and 2048, still getting the error.
Poll model relationships:
public function options()
{
return $this->hasMany('App\Models\Option');
}
public function votes()
{
return $this->hasManyThrough('App\Models\Vote', 'App\Models\Option');
}
Polls migration:
Schema::create('polls', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('question');
$table->integer('isActive');
$table->timestamps();
});
Option Model:
public function poll()
{
return $this->belongsTo('App\Models\Poll');
}
public function votes()
{
return $this->hasMany('App\Models\Vote');
}
Options migration:
Schema::create('options', function (Blueprint $table) {
$table->bigIncrements('id');
$table-> unsignedBigInteger('poll_id')->index()->nullable();
$table->foreign('poll_id')->references('id')->on('polls')->onDelete('cascade')->onUpdate('cascade')->nullable();
$table->string('text');
$table->timestamps();
});
Vote model:
public function user()
{
return $this->belongsTo('App\Models\User');
}
public function option()
{
return $this->belongsTo('App\Models\Option');
}
Votes migration:
Schema::create('votes', function (Blueprint $table) {
$table->bigIncrements('id');
$table-> unsignedBigInteger('user_id')->index()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade')->nullable();
$table-> unsignedBigInteger('option_id')->index()->nullable();
$table->foreign('option_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade')->nullable();
$table->unique(['user_id', 'option_id']);
$table->timestamps();
});
And then when I want to create a poll with my seeder (memory error comes even when I create a SINGLE row):
Right now my json file looks like this:
[
{ "isActive" : 1, "question" : "¿Qué es lo más importante para ti en una primera cita?", "optionOne" : "Una buena conversación", "optionTwo" : "Atracción física", "optionThree" : "Sentido del humor","optionFour" : "Intereses comunes" }
]
```
PollsSeeder
```
$json = File::get(base_path() . '/json/Polls.json');
$polls = json_decode($json, true);
Log::info('Decoded JSON:', $polls);
foreach ($polls as $key => $data)
{
$poll = Poll::create([
'question' => $data['question'],
'isActive' => $data['isActive'],
]);
if($data['optionOne'] != '')
{
Option::create([
'poll_id' => $poll->id,
'text' => $data['optionOne'],
]);
}
if($data['optionTwo'] != '')
{
Option::create([
'poll_id' => $poll->id,
'text' => $data['optionOne'],
]);
}
if($data['optionThree'] != '')
{
Option::create([
'poll_id' => $poll->id,
'text' => $data['optionOne'],
]);
}
if($data['optionFour'] != '')
{
Option::create([
'poll_id' => $poll->id,
'text' => $data['optionOne'],
]);
}
}
```