Php 如何按数据透视表中的数据筛选集合
我将对象集合存储在变量“$articles”中。每篇文章有1-3个类别。这些类别可以通过变量“$CATID”访问(见下文)。我还有一个1-3个类别的集合存储在变量“$categoryChoice”中。这些是用户选择的类别 我只想显示在变量“$categoryChoice”中存储了一个或多个类别的文章。我就快到了,但我不知道如何将“$catIDs”与每一篇特定的文章链接起来,然后将它们与“$categoryChoice”ID匹配 我已经查过文件了,但是我迷路了!(拉威尔5) 数据库表:“文章”(id、标题等)类别(id、名称)“文章类别”(文章id、类别id) 我的文章管理员:Php 如何按数据透视表中的数据筛选集合,php,laravel-5.1,Php,Laravel 5.1,我将对象集合存储在变量“$articles”中。每篇文章有1-3个类别。这些类别可以通过变量“$CATID”访问(见下文)。我还有一个1-3个类别的集合存储在变量“$categoryChoice”中。这些是用户选择的类别 我只想显示在变量“$categoryChoice”中存储了一个或多个类别的文章。我就快到了,但我不知道如何将“$catIDs”与每一篇特定的文章链接起来,然后将它们与“$categoryChoice”ID匹配 我已经查过文件了,但是我迷路了!(拉威尔5) 数据库表:“文章”(i
public function index(Request $request)
{
$lat = $request->get('lat');
$lng = $request->get('lng');
// THIS GETS THE USER DEFINED CATEGORY CHOICES
$categoryChoice = $request->get('categoryList');
$distance = 1;
$query = Article::getByDistance($lat, $lng, $distance);
if(empty($query))
{
return redirect()->action('HomeController@index');
}
$ids = [];
//Extracts the article/store id's
foreach($query as $q)
{
array_push($ids, $q->id);
}
$articles = Article::find($ids);
$catIDs = [];
foreach ($articles as $article)
{
array_push($catIDs, $article->categories->lists('id'));
}
// if $categoryChoice is equal to $catIDs only show those articles.
return view('articles.index', compact('categories', 'days'))->withArticles($articles);
}
以下是我的文章模型的相关部分:
public function categories()
{
return $this->belongsToMany('App\Category')->withTimestamps();
}
public static function getByDistance($lat, $lng, $distance)
{
$results = DB::select(DB::raw('SELECT id, ( 3959 * acos( cos( radians(' . $lat . ') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(' . $lng . ') ) + sin( radians(' . $lat .') ) * sin( radians(lat) ) ) ) AS distance FROM articles HAVING distance < ' . $distance . ' ORDER BY distance') );
return $results;
}
public function categories()
{
返回$this->belongtomany('App\Category')->withTimestamps();
}
公共静态函数getByDistance($lat、$lng、$distance)
{
$results=DB::select(DB::raw('select id,(3959*acos(弧度('.$lat'))*cos(弧度(lat))*cos(弧度(lng)-弧度('.$lng'))+sin(弧度('.$lat'))*sin(弧度(lat)),作为与距离小于“.$distance.”的物品的距离);
返回$results;
}
在文章模型中,您应该设置关系
public function categories()
{
return $this->belongsToMany('App\Category');
}
然后可以查询关系:
$articles = Article::whereHas('categories', function ($query) use ($categoryChoice) {
$query->whereIn('categories.id', $categoryChoice);
})->get();
这里还有一个关于距离的查询。getByDistance听起来像一个查询范围。如果更改该方法以返回查询(不要get()
结果,只需返回$query
对象,即可链接这些方法。如果要使用laravel命名约定,可以将其称为scopeDistance($lat,$lng,$distance)
,并将其引用为distance
然后,您的索引方法简化为:
public function index(Request $request)
{
$lat = $request->get('lat');
$lng = $request->get('lng');
$distance = 1;
// THIS GETS THE USER DEFINED CATEGORY CHOICES
$categoryChoice = $request->get('categoryList');
$query = Article::distance($lat, $lng, $distance)
->whereHas('categories', function ($query) use ($categoryChoice) {
$query->whereIn('categories.id', $categoryChoice);
})->get();
if(count($articles) == 0)
{
return redirect()->action('HomeController@index');
}
return view('articles.index', compact('categories', 'articles'));
}
感谢heaps。我已经在我的文章模型中设置了r/ship。当我尝试你的代码时,我得到了一个错误:“未定义变量:categoryChoice”。我不知道为什么。我把你的代码放在我的最后一行的正上方。哦,我错过了一个use语句。由于回调,范围发生了变化。我编辑了我的答案。这很好。它有效,但…它意味着它getByDistance不再工作。我有一个存储在$articles中的文章集合,它受到距离的限制。现在,它列出了所有具有特定类别的文章,但不限制它们之间的距离。必须有一种方法将它们合并到一起?对于所有的问题,很抱歉!您的代码示例中有很多内容!我将进行另一次编辑。哇非常感谢。我在上面添加了getByDistance。我将函数名更改为scopeDistance,并调用了返回$query的变量$query,对吗?我现在遇到了以下错误:Article.php第48行中的ErrorException:类的Object Illumb\Database\Eloquent\Builder无法转换为字符串。我将继续尝试解决此问题我自己,但我想我会分享。再次感谢!