【问题标题】:Querying polymorphic table and related tables for records查询多态表和相关表的记录
【发布时间】:2020-09-29 02:24:28
【问题描述】:

您好,我有一个活动表,其中包含已发布的回复和线程的记录。我正在尝试查询活动表以访问回复和线程表以进行搜索以返回记录,但我无法理解为什么我的查询不起作用。

这是我所拥有的:

$results = \DB::table('activities')
        ->join('threads', function($builder) use ($search) {
            $builder->on('threads.id', '=', 'activities.activity_id')
            ->where('threads.body', 'LIKE', '%' . $search . '%');

        })
        ->join('replies', function($builder) {
            $builder->on('replies.id', '=', 'activities.activity_id');

        })
        ->where('replies.body', 'LIKE', '%' . $search . '%')
        ->orWhere('threads.title', 'LIKE', '%' . $search . '%')
        ->orWhere('threads.body', 'LIKE', '%' . $search . '%')
        ->get();

谁能帮帮我?

谢谢。

"select * from `activities` inner join `threads` on `threads`.`id` = `activities`.`activity_id` and `activities`.`activity_type` = ? inner join `replies` on `replies`.`id` = `activities`.`activity_id` and `activities`.`activity_type` = ? where `replies`.`body` LIKE ? or `threads`.`title` LIKE ? or `threads`.`body` LIKE ?

【问题讨论】:

    标签: laravel


    【解决方案1】:

    在多态关系中你有两列来保存关系信息,在这种情况下必须有'activities.activity_id','activities.activity_type'

    您应该在 join 语句中包含第二列:

     $results = \DB::table('activities')
                ->leftJoin('threads', function($builder) {
                    $builder->on('threads.id', '=', 'activities.activity_id')
                    ->where('activities.activity_type',Thread::class);
    
            })
            ->leftJoin('replies', function($builder) {
                $builder->on('replies.id', '=', 'activities.activity_id')
                ->where('activities.activity_type',Reply::class);
            })
            ->where('replies.body', 'LIKE', '%' . $search . '%')
            ->orWhere('threads.title', 'LIKE', '%' . $search . '%')
            ->orWhere('threads.body', 'LIKE', '%' . $search . '%')
            ->get();
    

    你可以这样做:

    在您的活动模型中添加以下关系:

      public function thread()
        {
            return $this->belongsTo(Thread::class,'activity_id')
                ->where('activity_type',Thread::class);
        }
    
    public function replay()
    {
        return $this->belongsTo(Replay::class,'activity_id')
            ->where('activity_type',Replay::class);
    }
    

    现在你可以像这样使用普通的 whereHas 了:

      $results = Activity::with('activityable')->whereHas('thread', function ($query) use ($search) {
                $query->where('threads.body', 'LIKE', '%' . $search . '%')
                    ->orWhere('threads.title', 'LIKE', '%' . $search . '%');
            })->orWhereHas('replay', function ($query) use ($search) {
                $query->where('replies.body', 'LIKE', '%' . $search . '%');
    
            })->get();
    

    请注意,我不确定 Activity 模型中的多态关系名称, 将关系名称“activityable”替换为模型中的实际名称。

    【讨论】:

    • 感谢您提供可能的解决方案。但是我的查询仍然没有结果。
    • 很高兴看到使用 laravel eloquent 构建了什么查询。为此,您可以使用toSql 方法代替get。一旦您知道查询的问题所在,您就可以调整您的 eloquent 并获得正确的查询。
    • 我认为在我的情况下,我无法查询活动表,因为它是多态的并且不包含我想要的记录,这是真的吗?我现在已将查询包含在正文中。
    • 你能分享你的模型吗?
    • 你绝对可以查询模型,但是如果没有找到给定搜索的记录,那么它应该是空数组
    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    相关资源
    最近更新 更多