半复杂的Eloquent查询

时间:2014-03-20 17:27:49

标签: php laravel eloquent

我正在制作一个雄辩的查询来编辑新闻通讯,但我已经碰壁了。

我要做的是创建一个用户可以选择出版物和日期的UI。理想情况下,它会编制该出版物类别(故事> 0)和属于它的故事的列表。

以下是我的3个型号:

故事

public function user()
{
    return $this->belongsTo('User', 'user_id');
}

public function publication()
{
        return $this->belongsTo('Workbench\Dailies\Publication', 'publication_id');
}

public function category()
{
        return $this->belongsTo('Workbench\Dailies\Category', 'category_id');
}

公开

public function story()
{
    return $this->belongsTo('Workbench\Dailies\Story');
}

public function stories()
{
    return $this->hasMany('Workbench\Dailies\Story', 'publication_id');
}

public function category()
{
    return $this->belongsTo('Workbench\Dailies\Category', 'publication_id');
}

类别

public function story()
{
        return $this->belongsTo('Workbench\Dailies\Story', 'category_id');
}

public function publications()
{
        return $this->belongsTo('Workbench\Dailies\Publication', 'publication_id');
}

public function stories()
{
        return $this->hasMany('Workbench\Dailies\Story', 'category_id');
}

以下是我的表格外观:

故事

  • 含量
  • USER_ID
  • publication_id
  • CATEGORY_ID
  • 出版日期

公开

  • ID
  • 名称

分类

  • ID
  • 名称
  • publication_id

以下是我目前在存储库中的内容。

public function compileStories($input)
{
    return Category::has('stories', '>', 0)
    ->with('publications')
    ->whereHas('stories', function ($query) use ($input)
        {
            $query->where('publish_date', $input['publish_date']);
            $query->where('publication_id', $input['publication_id']);
        });
}

我是朝着正确的方向前进,还是有办法改进上面的代码?它目前没有按预期运行。

1 个答案:

答案 0 :(得分:1)

我在这里看到的一些事情可能会帮助你理顺。

首先 - 有些模型在不了解您的整个应用程序的情况下会有奇怪的关系。 Story模型不需要发布关系,因为它可以通过类别关系检索,除非您需要它。分类模型不再需要故事和故事关系,除非我不知道的故事还有更多内容。在您的示例中,您应该只需要hasMany关系。出版物模型只需要类别关系。

现在,在对模型进行一些清理之后,让我们看看你的查询。使用类别模型返回结果似乎完全适合您想要的结果。但是,您可以查看出版物,而无需深入了解您的故事。我没有测试它,但你可能不需要使用$ input行,因为$ input在更大的范围内。您还缺少对whereHas子句中where语句的条件检查。查询应该能够简化如下:

Category::where('publication_id', '=', $input['publication_id'])
    ->whereHas('stories', function($query)
    {
        $query->where('publish_date', '=', $input['publish_date']);
    })
    ->get()