Laravel - сумма найденных сообщений цена

Как я могу суммировать цену только за сообщения, которые я искал? У меня есть страница поиска, и я ищу по дате, поэтому я ищу сообщения по дате. И когда я набираю желаемую дату, мне нужно просуммировать цены на все публикации, найденные функцией поиска для этой даты. Вот мой код.

Это мой поиск в web.php:

Route::get('/search', 'PagesController@search');

Route::post('/search',function(){
    $q = Input::get ( 'q' );
    $post = auth()->user()->posts()->where('ime','LIKE', '%'.$q.'%')->get();
    if(count($post) > 0)
        return view('search')->withDetails($post)->withQuery ( $q );
    else return view ('search')->withMessage('Nema rezultata Vaše pretrage. Probajte ponovo!');
});

А это моя функция поиска в PagesController:

public function search(){
        $user_id = auth()->user()->id;
        $user = User::find($user_id);
        return view('search')->with('posts', $user->posts);
    }

А это мой search.blade.php с нижним колонтитулом таблицы, где должна суммироваться цена моих сообщений:

<tfoot>
   <tr>
      <th>UKUPAN IZNOS:&nbsp;&nbsp;{{ Auth::user()->posts()->sum('cijena') }}&euro;</th>               
   </tr>
</tfoot>

но когда я набираю это, мне складывается цена за все сообщения, а мне нужны только те, которые искали. Какие-либо предложения?


person Milos    schedule 10.08.2019    source источник
comment
где price используется в вашем коде?   -  person Flame    schedule 10.08.2019
comment
Извините, это не цена его 'cijena'   -  person Milos    schedule 10.08.2019
comment
ну, на ваш взгляд, вы можете просто использовать $posts->sum('cijena') правильно, поскольку вы передаете ему переменную 'posts'. Однако это сводится к сумме сбора, но лучше сделать это с помощью построителя запросов, то есть posts()->sum('cijena').   -  person Flame    schedule 10.08.2019


Ответы (1)


... но когда я набираю это, мне складывается цена за все сообщения, и мне нужны только те, которые искали

Это потому, что в вашем представлении есть такая строка:

<th> ... {{ Auth::user()->posts()->sum('cijena') }} ... </th>

Это выполняет другой запрос напрямую, чтобы получить общую сумму cijena. Таким образом, независимо от того, ограничиваете ли вы свои результаты или нет, вывод будет в одном и том же значении. Этот другой запрос имеет какое-либо влияние на остальные запрашиваемые значения.

Что вы можете сделать, так это вычислить это значение в основном запросе и вернуть его в представление:

Route::post('/search', function () {
    $q = Input::get('q');
    $posts = auth()->user()->posts()->where('ime', 'LIKE', '%' . $q . '%')->get();

    if (count($posts) > 0)
    {
        $sum = $posts->sum('cijena'); // <---

        return view('search')->withDetails($posts)->withTotal($sum);
    }   //                                        ^^^^^^^^^^^^^^^^^
    else
    {
        return view('search')->withMessage('Your error message goes here!');
    }
});

Итак, теперь у вас будет доступ к дополнительной переменной $total в вашем файле лезвия:

<th> ... {{ $total) }} ... </th>

Кроме того, нет необходимости определять два маршрута для одной и той же операции, вы можете сократить все это одним простым методом. Кроме того, вы не должны выполнять запросы из внешнего интерфейса. Сделайте следующее:

# web.php

Route::get('/search', 'PagesController@search');

Затем в вашем контроллере:

# PageController.php

use Illuminate\Http\Request;

// ...

public function search(Request $request)
{
    $posts = auth()
        ->user()
        ->posts()
        ->when($request->has('q'), function ($q) { // first check if there is a query
            return $q->where('ime', 'LIKE', '%' . request('q') . '%'); // if so, apply filter
        })
        ->get();

    if (count($posts) > 0) // checking if there is enough posts..
    {
        $sum = $posts->sum('cijena'); // if so get the sum of 'cijena'

        return view('search')->withDetails($posts)->withTotal($sum);
    }   //                                         ^^^^^^^^^^^^^^^^
    else
    {
        return view('search')->withMessage('Your error message goes here!');
    }
}

Обновлять

Это строка, которая вызывает ошибку:

<p class="searchp">Rezultati vaše pretrage <b> {{$q}} </b>: </p>

Это потому, что я не включил переменную $q. Просто добавьте его в свой ответ, если он вам понадобится:

// ...
return view('search')->withDetails($posts)->withTotal($sum)->with('q', request('q'));
// ...
person Kenny Horna    schedule 10.08.2019
comment
Хорошо, теперь он работает нормально. Но у меня две проблемы: первая заключается в том, что теперь на странице поиска, прежде чем я помещаю что-либо для поиска, она показывает мне все созданные сообщения, мне просто не нужно ничего показывать, прежде чем я буду искать сообщения, и вторая проблема заключается в том, что у меня есть ошибка из мой search.blade.php для Undefined variable: q, позвольте мне показать вам код - person Milos; 11.08.2019
comment
@Milos ошибка может быть связана с тем, что вы используете переменную где-то в своем представлении, попробуйте найти $q. Если вы не хотите ничего показывать в начале, измените код, чтобы сначала проверить, есть ли ввод запроса ($request->has('q')), а затем сделайте оператор if / else, чтобы поместить запрос в часть if, а ваш ответ по умолчанию в else часть. - person Kenny Horna; 11.08.2019
comment
так что мне просто нужно поставить $request->has('q') перед if и else? И я также добавляю with('q', request('q'));, где вы мне сказали, но ничего не происходит, снова та же ошибка - person Milos; 11.08.2019
comment
Он должен работать. Попробуйте dd(request('q')) в вашем контроллере, чтобы увидеть, устанавливаете ли вы это значение в своем представлении ... если да ... убедитесь, что вы установили строку, как я показал. Вы также можете использовать другое имя переменной, например ->withTerm(request('q')); son, тогда в вашем представлении замените $q на $term. - person Kenny Horna; 11.08.2019
comment
Также @Milos, эти следующие вопросы, похоже, являются частью самого нового вопроса с надлежащим объяснением, если вы не можете решить проблему. Надеюсь, я был вам полезен. - person Kenny Horna; 11.08.2019