У меня есть бэкэнд, на котором я могу создать опрос. В рамках опроса я могу создать вопрос для опроса. А для вопроса опроса я могу создать много ответов на опрос.

Если я сделаю что-то подобное в своем контроллере

$poll = DB::table('poll')->orderBy('id', 'desc')->first();
$question = DB::table('poll_question')->where('poll_id', $poll->id)->first();
$answers = DB::table('poll_answer')->select('answer')->where('question_id', $question->id)->get();

print_r("<pre>");
    print_r($answers);
print_r("</pre>");

Я вижу следующий результат

Array
(
    [0] => stdClass Object
        (
            [answer] => Answer 1
        )

    [1] => stdClass Object
        (
            [answer] => Answer 2
        )

    [2] => stdClass Object
        (
            [answer] => Answer 3
        )

    [3] => stdClass Object
        (
            [answer] => Answer 4
        )

)

Итак, в приведенном выше опросе было дано 4 возможных ответа на вопрос опроса.

Теперь у меня есть интерфейс, который отображает вопрос, и переключатель для каждого PollAnswer. Когда они выбирают одно и сохраняют, я получаю ответ на опрос. Если я сделаю что-то подобное

$pollResponses = DB::table('poll_response')->select('response')->where('poll_id', $poll->id)->get();

Результат может быть примерно таким

Array
(
    [0] => stdClass Object
        (
            [response] => Answer 1
        )

    [1] => stdClass Object
        (
            [response] => Answer 4
        )

    [2] => stdClass Object
        (
            [response] => Answer 4
        )

    [3] => stdClass Object
        (
            [response] => Answer 2
        )

    [4] => stdClass Object
        (
            [response] => Answer 3
        )
)

Так что я могу видеть, что выбрали люди. Теперь для каждого возможного PollAnswer мне нужно подсчитать количество PollResponse, которые к нему относятся. Итак, для приведенных выше данных я должен получить что-то вроде

1 = 1
2 = 1
3 = 1
4 = 3

Есть ли какой-нибудь простой способ сделать это в Laravel, или мне нужно будет зацикливать и ответы, и ответы, чтобы получить отдельные подсчеты?

2
katie hudson 21 Мар 2016 в 19:05

2 ответа

Лучший ответ

Я не знаю какого-либо решения для laravel, но вы всегда можете отправить ответы в отдельный массив, а затем использовать функцию php array_count_values($array) (http://php.net/manual/en/function.array-count-values.php) в новом массиве.

$newArray = array();
for($i=0; $i < count($pollResponses); $i++){
    array_push($newArray, $pollResponses[$i]->response);
};

$count = array_count_values($newArray);

Он вернет двумерный массив с ответом в качестве ключа и количеством раз, когда он встречается в качестве значения.

2
Alex Cobb 21 Мар 2016 в 16:56

Предполагая, что вы используете модели, вы можете сделать это в Laravel.

$polls = Poll::with(['questions.answers'])->get();

Ваш файл Poll.php

...
class Poll extends Model{
    public function questions(){
        return $this->hasMany(Question::class);
    }
}

Ваш файл Question.php

...
class Question extends Model{
    public function answers(){
        return $this->hasMany(Answer::class);
    }
}

А затем в вашем файле просмотра (при условии, что это .blade.php)

@foreach($polls as $poll)
    @foreach($poll->questions as $question)
        {{ $question->title }}
        <ul>
            @foreach($question->answers as $answer)
                <li>{{ $answer->title }} </li>
            @endforeach
        </ul>
    @endforeach
@endforeach
1
Hrach 21 Мар 2016 в 20:17