Php 如何按数据透视表中的数据筛选集合

Php 如何按数据透视表中的数据筛选集合,php,laravel-5.1,Php,Laravel 5.1,我将对象集合存储在变量“$articles”中。每篇文章有1-3个类别。这些类别可以通过变量“$CATID”访问(见下文)。我还有一个1-3个类别的集合存储在变量“$categoryChoice”中。这些是用户选择的类别 我只想显示在变量“$categoryChoice”中存储了一个或多个类别的文章。我就快到了,但我不知道如何将“$catIDs”与每一篇特定的文章链接起来,然后将它们与“$categoryChoice”ID匹配 我已经查过文件了,但是我迷路了!(拉威尔5) 数据库表:“文章”(i

我将对象集合存储在变量“$articles”中。每篇文章有1-3个类别。这些类别可以通过变量“$CATID”访问(见下文)。我还有一个1-3个类别的集合存储在变量“$categoryChoice”中。这些是用户选择的类别

我只想显示在变量“$categoryChoice”中存储了一个或多个类别的文章。我就快到了,但我不知道如何将“$catIDs”与每一篇特定的文章链接起来,然后将它们与“$categoryChoice”ID匹配

我已经查过文件了,但是我迷路了!(拉威尔5)

数据库表:“文章”(id、标题等)类别(id、名称)“文章类别”(文章id、类别id)

我的文章管理员:

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无法转换为字符串。我将继续尝试解决此问题我自己,但我想我会分享。再次感谢!