3

当然,我可以将 order_by 与第一个表中的列一起使用,但不能与第二个表中的列一起使用,因为结果是部分的。

如果我使用“加入”,一切都会完美,但我需要雄辩地实现这一目标。难道我做错了什么?

这是一个例子:

//with join
$data = DB::table('odt')
    ->join('hdt', 'odt.id', '=', 'hdt.odt_id')
    ->order_by('hdt.servicio')
    ->get(array('odt.odt as odt','hdt.servicio as servicio'));
foreach($data as $v){
    echo $v->odt.' - '.$v->servicio.'<br>'; 
}
echo '<br><br>';
//with eloquent
$data = Odt::get();
foreach($data as $odt){
    foreach($odt->hdt()->order_by('servicio')->get() as $hdt){
        echo $odt->odt.' - '.$hdt->servicio.'<br>';
    }
}
4

4 回答 4

1

在您的模型中,您需要明确告诉关系按该字段排序。

因此,在您的 odt 模型中添加以下内容:

public function hdt() {
   return $this->has_many('hdt')->order_by('servicio', 'ASC');
}

这将允许在使用此关系时对第二个表进行排序,并且在 Fluent 连接语句中不需要 order_by 行。

于 2013-03-06T17:31:13.337 回答
0

我建议不要按照 codivist 的建议将 order by 包含在关系方法中。您所采用的方法在功能上与 codivist 建议相同。

这两种解决方案的区别在于,第一种是通过 hdt.servicio 订购 odt (所有结果)。在第二个中,您以自然顺序检索 odt,然后通过 servico 对每个 odt 包含的 hdt 进行排序。

第二种解决方案的效率也低得多,因为您要进行一次查询以提取所有 odt,然后对每个 odt 进行附加查询以提取其 hdts。检查分析器。考虑到您的初始查询并且您只检索一列,这样的事情会起作用吗?

HDT::where( 'odt_id', '>', 0 )->order_by( 'servico' )->get('servico');
于 2013-03-07T18:59:12.757 回答
0

现在我发现这很简单!我必须对第二个表进行查询并使用函数 odt() 获取第一个表的内容,以建立关系“belongs_to”

//solution
$data = Hdt::order_by('servicio')->get();
foreach($data as $hdt){
    echo $hdt->odt->odt.' - '.$hdt->servicio.'<br>';
}
于 2013-03-08T01:30:07.663 回答
0

简单的答案是:

$data = Odt::join('hdt', 'odt.id', '=', 'hdt.odt_id')
    ->order_by('hdt.servicio')
    ->get(array('odt.odt as odt','hdt.servicio as servicio'));

任何你可以用 Fluent 做的事情,你也可以用 Eloquent 做。如果您的目标是hdts使用他们的odtstho 进行检索,我建议使用反向查询以提高可读性:

$data = Hdt::join('odt', 'odt.id', '=', 'hdt.odt_id')
    ->order_by('hdt.servicio')
    ->get(array('hdt.servicio as servicio', 'odt.odt as odt'));

这两者的作用完全相同。

解释为什么这样做:

每当您调用静态方法Posts::where(...)时,Eloquent 都会为您返回一个 Fluent 查询,与DB::table('posts')->where(...). 这使您可以灵活地构建您喜欢的任何查询。这是一个例子:

// Retrieves last 10 posts by Johnny within Laravel category
$posts = Posts::join('authors', 'authors.id', '=', 'posts.author_id')
    ->join('categories', 'categories.id', '=', 'posts.category_id')
    ->where('authors.username', '=', 'johnny')
    ->where('categories.name', '=', 'laravel')
    ->order_by('posts.created_at', 'DESC')
    ->take(10)
    ->get('posts.*');
于 2013-03-08T05:03:24.267 回答