gpt4 book ai didi

php - 拉维尔 : Eager loading pivot table and sorting on pivot table field

转载 作者:行者123 更新时间:2023-11-30 23:05:35 27 4
gpt4 key购买 nike

我有一个国家表和一个数据透视表 Country_language,其中列出了所有国家及其可用语言的翻译。

表结构如下:

Languages
--------------
ID
Locale

Records :
1 - EN
2 - FR

Countries
------------
ID
code

Records:
1 - BE
2 - US

Country_language
-----------------------
ID
country_id
language_id
name

Records :

1 - 1 - 1 - Belgium

2 - 1 - 2 - Belgique

3 - 2 - 1 - United States

4 - 2 - 3 - Les États-Unis

在我的国家模型中,我与语言数据透视表的关系如下:

public function translation()
{
return $this->belongsToMany('Language', 'country_language', 'country_id','language_id')->withPivot('name');

}

现在我想获取给定语言的所有国家/地区的列表,这应该按名称 DESC 等排序。

我用下面的代码来做到这一点:

$countries = Country::with(array('translation' => function($query) {
$query->where('language_id', '=', 1); // fetch countries in English
$query->orderBy('name', 'desc');
}))->get();

如果我打印 $countries 但是我会得到以下列表,它的顺序不正确。我希望它首先给出“美国”,然后给出“比利时”。

[
{
"id": 1,
"code": "BE",
"translation":
[{
"id": 1,
"locale": "EN",
"pivot":
{
"country_id": 1,
"language_id": 1,
"name": "Belgium"
}
}]
},
{
"id": 2,
"code": "US",
"translation":
[{
"id": 2,
"locale": "EN",
"pivot":
{
"country_id": 2,
"language_id": 1,
"name": "United States"
}
}]
}
]

如果我检查正在运行的查询,它看起来如下:

 select `languages`.*, `country_language`.`country_id` as `pivot_country_id`, `country_language`.`language_id` as `pivot_language_id`, 
`country_language`.`name` as `pivot_name` from `languages`
inner join `country_language` on `languages`.`id` = `country_language`.`language_id`
where `country_language`.`country_id` in (?, ?) and `language_id` = ? order by `name` desc

这是正确的,如果我在 MySQL 中运行它,我会得到按名称降序排列的国家列表。

我是不是做错了什么,或者这可能是 Laravel 中的一个问题?感谢您花时间回答。

编辑:基本上我只想在 Eloquent 中进行以下查询。看起来很简单但显然很难(如果可能的话)在 Eloquent 中完成:

select country_language.*, languages.* 
from country_language
join countries on countries.id = country_language.country_id
join languages on languages.id = country_language.language_id
where country_language.language_id = 1
order by country_language.name desc

最佳答案

您正在使用预加载约束。这不会影响您的外部查询的结果 - 它只会限制和排序相关记录。如果你愿意,例如检索 $countries->first()->translation -> 然后按名称排序。

在您的情况下,您将收到所有国家/地区,即使 country_language 表中没有记录。因为您的限制仅适用于相关记录。

如果您只想要在 country_language 表中有相关​​记录的国家/地区,您应该使用 whereHas。这可能会导致类似的结果:

$countries = Country::with(array('translation' => function($query) {
$query->where('language_id', '=', 1); // fetch only country_language records with language_id = 1
}))->whereHas('translation', function($query) {
$query->where('language_id', '=', 1); // fetch countries in English
$query->orderBy('name', 'desc');
->get();

请检查这是否会以正确的方式排列您的结果。我可以想象 orderBy 必须链接到原始国家集合,因此在内部函数中。

它应该是这样的:

$countries = Country::with(array('translation' => function($query) {
$query->where('language_id', '=', 1); // fetch only country_language records with language_id = 1
}))->whereHas('translation', function($query) {
$query->where('language_id', '=', 1); // fetch countries in English
->orderBy('name', 'desc');
->get();

我不确定在这种情况下您是否可以在 name 列上订购。也许它不可访问,那么您可能需要使用连接语句。

关于php - 拉维尔 : Eager loading pivot table and sorting on pivot table field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22052009/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com