【问题标题】:Laravel, applying where after with in Eloquent syntaxLaravel,在 Eloquent 语法中应用 where after with
【发布时间】:2014-03-07 13:03:16
【问题描述】:

我正在尝试按类别获取所有问题,其中问题的作者是Y

这就是我尝试这样做的方式:

QuestionCategory::with('questions')->where('questions.source', '=', $userId)->get();

问题在于,它不适用于questions 表的位置,而是question_categories 一个。

找不到列:1054 未知列 'questions.source' 在 'where 子句' (SQL: select * from question_categories where questions.source = 2)

知道我错过了什么吗?

【问题讨论】:

  • 阅读文档,待定。雄辩的页面包含您需要的所有信息。确保在模型上定义关系,并添加一个闭包来扩展关系查询,如下面的一些示例所述。

标签: php mysql orm laravel eloquent


【解决方案1】:

问题表在单独的查询中预先加载,因此您的 where 语句无权访问问题表。

您必须加入它才能查询它。

QuestionCategory::with('questions')
    ->join('questions', 'question_id', '=', 'questions.id')
    ->where('questions.source', '=', $userId)
    ->get();

【讨论】:

  • 但是...为什么是 ->join('questions', 'question_id', '=', 'questions.id') ?我不明白
  • 是的,它看起来确实有点笨拙。但是急切加载是如何工作的,它将加载查询“SELECT * FROM question_categories”,然后它将针对上一条语句返回的每个 ID 运行单独的查询“SELECT * FROM questions WHERE id IN (.., ..,)” .所以本质上,您的原始查询是“SELECT * FROM question_categories WHERE questions.source = $userId”。加入并不理想,但目前我认为没有更好的方法。
【解决方案2】:

如果您希望基于关系进行限制,您将不得不稍微不同地构建您的代码。这应该对你有用...

QuestionCategory::with(array('questions' => function($q) use ($userID)
{
    $q->where('source', '=', $userID);
}))->get();

请注意,这并不限制QuestionCategory,因为它们仍然会被抓取。如果QuestionCategory 没有与该用户ID 相关联的源,它仍会获取QuestionCategory

如果您只需要具有该用户 ID 的来源的 QuestionCategories,您可以使用 whereHas() 函数。

$categories = QuestionCategory::whereHas('permissions', function($q)
{
    $q->where('name', '=', 'CreateUser');

})->get();

【讨论】:

    【解决方案3】:

    可能你应该看看 laravel 的关系系统。 在您的模型中,您可以指定两个表之间的关系。

    Class User Extends Eloquent {
        public function questions()
        {
             return $this->hasMany('Your Model Question name', 'userid column name in questions table', 'userid column name in users table')
        }    
    }
    

    然后访问那个关系

    $user = User::find('tape an userid');
    $questionsByUser = $user->questions;
    

    我不确定你问的是什么,但这会给你一个包含用户拥有的所有问题的实例。

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 2021-09-08
      • 2021-07-12
      • 1970-01-01
      • 2014-10-16
      • 2018-10-30
      • 2020-04-07
      • 2014-08-14
      • 2018-01-17
      相关资源
      最近更新 更多