代码之家  ›  专栏  ›  技术社区  ›  Jesse Orange

Laravel雄辩地获得多个列的相关内容

  •  0
  • Jesse Orange  · 技术社区  · 7 年前

    在我的应用程序中,我试图创建一个相关事件部分,其中显示与特定事件相关的所有事件。

    我有这个疑问

    public function show($id)
    {
        // The current event
        $event = Event::find($id);
    
        // Find related, upcoming events
        $tags = $event->tags;
    
        $relatedEvents = Event::where('startDate', '>=', Carbon::now())
        ->where(function ($query) use ($event) {
            $query->where('hostedBy', $event->hostedBy);
            $query->orWhere('type', $event->hostedBy);
            $query->orWhere('category', $event->hostedBy);
            $query->orWhere('sector', $event->hostedBy);
        })
        ->toSql();
    
        dd($relatedEvents);
    }
    

    哪个输出遵循SQL

    "select * from 事件 where 开始日期 >= ? and ( 招待所 = ? or 类型 = ? 或 类别 = ? 或 部门 = ?)"

    我试过了

    /**
     * Display the specified resource.
     *
     * @param  \App\Event  $event
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        // The current event
        $event = Event::find($id);
    
        // Find related, upcoming events
        $tags = $event->tags;
    
        $relatedEvents = Event::where('startDate', '>=', Carbon::now())
        ->where(function ($query) use ($event) {
            $query->where('hostedBy', $event->hostedBy);
            $query->orWhere('type', $event->hostedBy);
            $query->orWhere('category', $event->hostedBy);
            $query->orWhere('sector', $event->hostedBy);
            $query->orWhereHas('tags', function ($query) use ($tags) {
                $query->where('slug', $tags->slug);
            });
        })
        ->toSql();
    
        dd($relatedEvents);
    }
    

    但是通过这次尝试,我得到了未定义的变量 $tags

    可以有许多嵌套查询吗?

    这是因为我需要检查字段,但也需要比较给定给事件的标记。

    另外,如果当前文章根本没有标签,我该怎么办?

    更新

    public function show($id)
    {
        // The current event
        $event = Event::find($id);
    
        // Find related, upcoming events
        $tags = $event->tags;
    
        $relatedEvents = Event::where('startDate', '>=', Carbon::now())
        ->where(function ($query) use ($event, $tags) {
            $query->where('hostedBy', $event->hostedBy);
            $query->orWhere('type', $event->type);
            $query->orWhere('category', $event->category);
            $query->orWhere('sector', $event->sector);
            $query->orWhereHas('tags', function ($query) use ($tags) {
                foreach ($tags as $tag) {
                    $query->where('slug', $tag->slug);
                }
            });
        })
        ->orderBy('startDate', 'dsc')
        ->toSql();
    
        dd($relatedEvents);
    }
    

    我需要测试这个,但由于可能有多个标签,我循环通过它们。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Vipul    7 年前

    试试这个。您需要在第一次使用时传递$tags变量

     $relatedEvents = Event::where('startDate', '>=', Carbon::now())
        ->where(function ($query) use ($event, $tags) {
            $query->where('hostedBy', $event->hostedBy);
            $query->orWhere('type', $event->hostedBy);
            $query->orWhere('category', $event->hostedBy);
            $query->orWhere('sector', $event->hostedBy);
            $query->orWhereHas('tags', function ($query) use ($tags) {
                $query->where('slug', $tags->slug);
            });
        })
        ->toSql();
    
        2
  •  0
  •   arun    7 年前

    通过 tags 从一开始

    $relatedEvents = Event::where('startDate', '>=', Carbon::now())
        ->where(function ($query) use ($event, $tags) { // add tags here
            $query->where('hostedBy', $event->hostedBy);
            $query->orWhere('type', $event->hostedBy);
            $query->orWhere('category', $event->hostedBy);
            $query->orWhere('sector', $event->hostedBy);
            $query->orWhereHas('tags', function ($query) use ($tags) {
                $query->where('slug', $tags->slug);
            });
        })
        ->toSql();
    
        3
  •  0
  •   Pravin Soni    7 年前
    $query->orWhereHas('tags', function ($q) use ($tags) {
            $q->where('slug', $tags->slug);
        });
    

    在事件和标记之间定义了什么样的关系。我认为它有很多,所以在这种情况下,您应该使用$q->where('slug',$tags->slug);

    否则

    orWhereHas('tags');就足够了。