【问题标题】:How to 'order_by' on second table when using eloquent one-to-many使用雄辩的一对多时如何在第二张桌子上'order_by'
【发布时间】:2013-02-21 13:04:32
【问题描述】:

当然,我可以将 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>';
    }
}

【问题讨论】:

标签: php laravel eloquent


【解决方案1】:

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

所以在你的 odt 模型中添加这个:

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

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

【讨论】:

  • 它是相同的,因为它独立地对每行找到的所有项目进行排序。 (考虑到你的意思是函数 campos() )
【解决方案2】:

我建议不要按照 codivist 的建议在关系方法中包含 order by。你提出的方法在功能上与codivist建议相同。

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

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

HDT::where( 'odt_id', '>', 0 )->order_by( 'servico' )->get('servico');

【讨论】:

  • 也许我应该在我的示例中包含其他列,但目标是能够获取两个表中列的内容。
【解决方案3】:

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

//solution
$data = Hdt::order_by('servicio')->get();
foreach($data as $hdt){
    echo $hdt->odt->odt.' - '.$hdt->servicio.'<br>';
}

【讨论】:

    【解决方案4】:

    简单的答案是:

    $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 做。如果您的目标是用他们的odts 检索hdts,我建议使用逆向查询以提高可读性:

    $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')-&gt;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.*');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 2022-01-18
      • 2011-02-20
      • 2014-10-14
      • 2016-07-20
      相关资源
      最近更新 更多