Добавить новое значение в коллекцию. Laravel - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь добавить значение в пару поисков Eloquent и хотел бы добавить к результатам поиска дополнительное значение, значение будет логическим и будет использоваться для проверки, выполнил ли пользователь опрос в порядке показать это. Это мои поиски

//surveys sent to a group
$evaluatorGroup = EvaluationEvaluator::with('group.users', 'evaluation.survey')
    ->whereHas('evaluation', function ($query) use ($now) {
        $query->whereDate('init_date', '<=', $now);
        $query->whereDate('end_date', '>=', $now);
    })
    ->whereHas('group.users', function ($query) {
        $query->where('user_id', auth()->user()->id);
    })
    ->orderBy('updated_at', 'desc')
    ->get();

//surveys sent to the induvidual user
$evaluatorUser = EvaluationEvaluator::with('evaluation.survey')
    ->whereHas('evaluation', function ($query) use ($now) {
        $query->whereDate('init_date', '<=', $now);
        $query->whereDate('end_date', '>=', $now);
    })
    ->where('user_id', auth()->user()->id)
    ->get();
//the info for people who have answered is saved in the table survey_answers
Schema::create('survey_answers', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('survey_id')->unsigned();
    $table->integer('survey_question_id')->unsigned();
    $table->integer('user_id')->unsigned();
    $table->text('answer');
    $table->timestamps();
    $table->foreign('survey_id')->references('id')->on('surveys');
    $table->foreign('survey_question_id')->references('id')->on('survey_questions');
    $table->foreign('user_id')->references('id')->on('users');
});

//in the survey_answers model I have the survey_answers relationship
survey->answers

В идеале я хотел бы просто добавить значение с именем answered в качестве логического значения, чтобы я мог проверить это и либо отобразить опрос, либо нет. Конечный результат, который я хочу, - это скрыть опросы на панели инструментов, на которые пользователь уже ответил, чтобы они не всегда отображались, даже если на них уже есть ответы.

Как я могу выполнить sh это?

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Что я придумал

foreach ($evaluatorUser as $eU) {
    $eid = Evaluation::where('id', $eU->evaluation_id)->pluck('survey_id')->first();
    $answered = SurveyAnswer::where('survey_id', $eid)->where('user_id', auth()->user()->id)->count();
    if ($answered > 0){
        $eU['answered'] = true;
    }
}

foreach ($evaluatorGroup as $eG) {
    $eid = Evaluation::where('id', $eG->evaluation_id)->pluck('survey_id')->first();
    $answered = SurveyAnswer::where('survey_id', $eid)->where('user_id', auth()->user()->id)->count();
    if ($answered > 0){
        $eG['answered'] = true;
    }
}
0 голосов
/ 18 марта 2020

Есть два способа сделать это. Одним из способов было бы вручную перебирать записи - это болезненно, пример будет ..

foreach($evaluatorGroup as $k1 => $Evaluator)
    foreach($Evaluator->evaluation->survey as $k2 => $Survey) // assuming EvaluationEvaluator <-> evaluation is one to one relationship
        $evaluatorGroup[$k1]->evaluation->survey[$k2]->answered = true; 

Умный способ - go к вашей Survey модели (что, я считаю, в App \ Surveys или что-то подобное) и добавьте к нему свойство answered:

public $answered = null; // true, false, foo, bar whatever value you want

Конечно, вы можете оставить свойство там с любым значением, которое вы хотите. Если вы хотите, вы можете установить значение true по умолчанию:

public $answered = true;

Хотя, если вы хотите изменить значение свойства на основе других факторов (например, значения других столбцов таблицы в вашей модели), вы следует использовать Красноречивые мутаторы . Предположим, вы хотите автоматически установить значение answered равным true, после столбца answer. Вы можете использовать код ниже:

// inside model
public $answered = null;

public function getAnsweredAttribute($value) // $this->answered is passed here
{
    return empty($this->answer) ? false : true;
}

// outside model
$Survey->answered; // outputs false/true if $Survey->answer is empty/not

Надеюсь, этот ответ поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...