【问题标题】:Using Laravel 5, how do I get all() and order by belongsToMany relationship by the pivot table使用 Laravel 5,我如何通过数据透视表获取 all() 并按 belongsToMany 关系排序
【发布时间】:2016-06-06 03:29:18
【问题描述】:

我有优惠和常见问题解答。我有功能关系,我可以参考 $deal->faqs() 并返回正确的常见问题解答。

当我管理与交易相关的常见问题时,我试图解决的问题就出现了。在我的交易管理视图(新/编辑)中,我得到了所有常见问题解答。

$faqs = \App\Faq::all();    

这很好用,我什至可以通过我的复选框检查常见问题解答是否与交易相关:在视图中:

{!! Form::checkbox('faqlist[]', $faq->id, $deal->faqs->contains($faq->id) ? true : false) !!} 

所以现在我们有了所有常见问题的列表,并且检查了正确的问题。

我在数据透视表 (deal_faq) 上设置了一个订单列。该表包括:

  • deal_id
  • faq_id
  • 时间戳
  • 订购

在我的表单中,我构建并运行了一个拖放订购解决方案 (js)。通过工作,我的意思是,我可以拖放并更新隐藏字段值以反映正确的顺序。

创建交易时,这没有问题。获取所有常见问题解答,选中一些进行关联,拖动到排序,然后保存。

编辑交易时,我需要根据 deal_faq 表中的订单列进行加载。这是我的问题。

我尝试了一些方法,但总是出错。我尝试过的一个例子是:

$faqs = \App\Faq::orderBy('deal_faq.order', 'asc')->get();

这会返回一个错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'deal_faq.order' in 'order clause' (SQL: select * from `faq` order by `deal_faq`.`order` asc)

我认为问题在于我试图获取所有内容,但是按仅存在于相关常见问题解答的字段进行排序,因为订单字段位于 deal_faq 上。只是不知道如何解决。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    本质上你需要加入数据透视表,然后应用订单

    $faqs = \App\Faq::join('deal_faq', 'faqs.id', '=', 'deal_faq.faq_id')
        ->orderBy('deal_faq.order', 'asc')
        ->get();
    

    您可能需要调整表名和列名以匹配您的架构。

    现在您可以将此逻辑提取到Faq 模型的范围内

    class Faq extends Model
    {
        ...
    
        public function scopeOrdered($query)
        {
            return $query->join('deal_faq', 'faqs.id', '=', 'deal_faq.faq_id')
                ->orderBy('deal_faq.order', 'asc');
        }
    }
    

    然后像这样使用它

    $faqs = \App\Faq::ordered()->get();
    

    更新:

    这可以使常见问题解答井井有条,但它只会得到那些 已关联。会有一些不相关的常见问题解答,并且 因此没有订购。

    在这种情况下,您只需要使用outer join - LEFT JOIN。范围定义将如下所示

    public function scopeOrdered($query)
    {
        return $query->join('deal_faq', 'faqs.id', '=', 'deal_faq.faq_id', 'left')
            ->orderBy('deal_faq.order', 'asc');
    }
    

    或者更表达一点

    public function scopeOrdered($query)
    {
        return $query->leftJoin('deal_faq', 'faqs.id', '=', 'deal_faq.faq_id')
            ->orderBy('deal_faq.order', 'asc');
    }
    

    请考虑添加二级订单(即通过 id 或faqs 表中有意义的任何其他字段)。这样,无论您是否在数据透视表中定义了明确的顺序,您每次都会有一个确定性排序的结果集。

    【讨论】:

    • 这可以按顺序获取常见问题解答,但它只会获取已关联的常见问题解答。将有未关联的常见问题解答,因此未排序。我的问题指出我需要所有()常见问题解答,但如果有订单则订购。我是否还应该获取所有常见问题解答并以某种方式合并返回到视图的数组,以便我也可以显示未关联的数组?
    • 感谢您的更新。学习 Laravel,而不是 mysql。
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多