【问题标题】:Laravel - sum searched posts priceLaravel - 总搜索帖子价格
【发布时间】:2019-12-18 01:41:51
【问题描述】:

我怎样才能只为我搜索过的帖子求和价格?我有一个搜索页面,搜索的是日期,所以我按日期搜索帖子。当我输入我想要的日期时,我需要总结我的搜索功能为该日期找到的所有帖子价格。这是我的代码。

这是我在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>

但是当我输入这个时,它会将所有帖子的价格相加,而我只需要搜索过的帖子。有什么建议吗?

【问题讨论】:

  • 您的代码中在哪里使用了price
  • 对不起,它的'cijena'没有定价
  • 在您看来,您可以直接使用$posts-&gt;sum('cijena'),因为您将'posts' 变量传递给它。但是,这会对集合进行求和,但最好使用查询生成器,即posts()-&gt;sum('cijena')

标签: php laravel laravel-5 eloquent laravel-5.8


【解决方案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'));
// ...

【讨论】:

  • 好的,现在它工作正常。但是我有两个问题,一个是现在在搜索页面上,在我输入任何内容之前,它会显示所有创建的帖子,我只需要在搜索帖子之前不显示任何内容,第二个是我有一个错误我的 Undefined variable: q 的 search.blade.php,让我给你看代码
  • @Milos 错误可能是因为您在视图中的某处使用了该变量,请尝试查找$q。如果您不想在开头显示任何内容,请修改代码以首先检查是否有查询输入 ($request-&gt;has('q')),然后执行 if/else 语句将查询放入 if 部分和您的else 部分中的默认响应。
  • 所以我只需要将$request-&gt;has('q') 放在 if 和 else 之前?我还在你告诉我的地方添加了with('q', request('q'));,但没有任何反应,再次出现同样的错误
  • 它应该可以工作。在您的控制器中尝试dd(request('q')) 以查看您是否在视图中设置了该值。如果是这样.. 确保按照我显示的方式放置该行。您还可以使用另一个变量名称,例如 -&gt;withTerm(request('q')); son,然后在您的视图中将 $q 替换为 $term
  • 另外@Milos,以下问题似乎构成了新问题本身的一部分,并提供了适当的解释,以防您无法解决问题。我希望我对您有所帮助。
猜你喜欢
  • 2023-03-24
  • 2016-09-15
  • 2015-11-05
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
相关资源
最近更新 更多