【问题标题】:Query relation in same table with Eloquent ORM in Laravel 4.1在 Laravel 4.1 中使用 Eloquent ORM 查询同一张表中的关系
【发布时间】:2014-02-10 16:45:21
【问题描述】:

我刚刚发现 Laravel,并进入 Eloquent ORM。但我在以下一个小问题上磕磕绊绊。

我有三个具有以下结构和数据的表:

words

id | language_id | parent_id | word
-------------------------------------------
1  | 1           | 0         | Welcome
-------------------------------------------
2  | 2           | 1         | Bienvenue
-------------------------------------------

documents

id | title
---------------------
1  | Hello World
---------------------

documents_words

document_id | word_id
--------------------------
1           | 1
--------------------------

如您所见,我们在单词表中有父/子关系。

文档模型定义如下

class Documents extends Eloquent {

protected $table = 'documents';

public function words()
{
    return $this->belongsToMany('Word', 'documents_words', 'document_id');
}

}

还有单词模型:

class Word extends Eloquent {

protected $table = 'words';

public function translation()
{
    return $this->hasOne('Word', 'parent_id');
}


}

现在我的问题是我想检索已翻译单词的文档,所以我认为可以这样做:

$documents = Documents::whereHas('words', function($q)
{
    $q->has('translation');
})
->get();

但是我得到 0 个结果,所以我检查了 Eloquent 生成和使用的查询:

 select * from `prefix_documents`
 where
 (
select count(*) from 
`prefix_words`

inner join `prefix_documents_words` 

on `prefix_words`.`id` = `prefix_documents_words`.`word_id` 

where `prefix_documents_words`.`document_id` = `prefix_documents`.`id` 

and (select count(*) 
from `prefix_words` 
where `prefix_words`.`parent_id` = `prefix_words`.`id`) >= 1

  ) >= 1

问题是它不使用表的别名,我的查询应该更像这样才能工作(而且确实如此):

 select * from `prefix_documents`
 where
 (
select count(*) from 
`prefix_words`

inner join `prefix_documents_words` 

on `prefix_words`.`id` = `prefix_documents_words`.`word_id` 

where `prefix_documents_words`.`document_id` = `prefix_documents`.`id` 

and (select count(*) 
from `prefix_words` as `w`
where `w`.`parent_id` = `prefix_words`.`id`) >= 1

  ) >= 1

但是如何使用 Eloquent ORM 做到这一点?

非常感谢你们的帮助,希望我足够清楚。

【问题讨论】:

    标签: php laravel laravel-4 eloquent


    【解决方案1】:

    在 Word 模型中,更改

    public function translation()
    {
        return $this->hasOne('Word', 'parent_id');
    }
    

    public function translation()
    {
        return $this->belongsToMany('Word', 'words', 'id', 'parent_id');
    }
    

    这样我们告诉 Laravel 在使用你的查询时在 eloquent 中创建一个别名。我没有测试其他案例,但我认为它会起作用。

    【讨论】:

    • 您是否在数据库配置文件中设置了表前缀? “前缀”是我在配置中设置的。
    • 如果您在数据库配置中放置“前缀”,则默认行为是您的所有表都必须是前缀,例如:prefixdocuments、prefixwords。所以你也必须在你的 eloquent 模型中改变这一点。
    • 嗯,这对我来说似乎不对,我创建了带有迁移的表,直到现在模型没有任何问题,而且我从未在数据库中提到过前缀.php 配置文件。我还在配置文件中设置了'prefix_',而不仅仅是'prefix'。
    • 尝试删除前缀。很奇怪,只是创建的别名有一个前缀_。我在 laravel 的新安装中制作了这个。我建议你也这样做,只是为了保证。
    • 我也确认我已经删除了我的旧表,删除了 database.php 配置文件中的前缀,重新创建了我的表,并且生成的查询工作正常!因此,在设置前缀时,Eloquent ORM 生成查询字符串的方式似乎确实是一个问题。
    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 2017-03-16
    • 2015-04-09
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多