【问题标题】:Perform advanced where clause Eloquent执行高级 where 子句 Eloquent
【发布时间】:2014-11-13 04:42:01
【问题描述】:

我会知道如何执行“高级位置”。 我没有在文档中找到任何解释我想要什么的东西……即使在那里。 (参见:http://laravel.com/docs/4.2/queries#advanced-wheres)。

Post::whereHas('international_post_en', function($q) {
       $q->where('is_published', 1);
  })->whereHas('categories', function($q) {
       $q->where('name', 'test-one');
  })->orWhereHas('subcategories', function($q) {
       $q->where('name', 'test-two');
  })->with('categories', 'subtags')
    ->get();

我的查询如下所示:

select * from `posts` where `posts`.`deleted_at` is null and (select count(*) from `international_posts_en` where `international_posts_en`.`posts_id` = `posts`.`id` and `is_published` = ?) >= 1 and (select count(*) from `categories` inner join `posts_has_categories` on `categories`.`id` = `posts_has_categories`.`categories_id` where `posts_has_categories`.`posts_id` = `posts`.`id` and `name` = ?) >= 1 or (select count(*) from `subcategories` inner join `posts_has_subcategories` on `subcategories`.`id` = `posts_has_subcategories`.`subcategories_id` where `posts_has_subcategories`.`posts_id` = `posts`.`id` and `name_en` = ?) >= 1

但我希望我的查询看起来像这样:

select * from `posts` where `posts`.`deleted_at` is null and (select count(*) from `international_posts_en` where `international_posts_en`.`posts_id` = `posts`.`id` and `is_published` = ?) >= 1 and [(](select count(*) from `categories` inner join `posts_has_categories` on `categories`.`id` = `posts_has_categories`.`categories_id` where `posts_has_categories`.`posts_id` = `posts`.`id` and `name` = ?) >= 1 or (select count(*) from `subcategories` inner join `posts_has_subcategories` on `subcategories`.`id` = `posts_has_subcategories`.`subcategories_id` where `posts_has_subcategories`.`posts_id` = `posts`.`id` and `name_en` = ?) >= 1[)]

(对不起,可读性不是很好)

您可以在括号内看到更改。 因此,我希望将 whereHas 和 orWhereHas 子句组合在括号内。

是否可以使用 Laravel 查询生成器或者我应该进行手工查询?

提前谢谢你。

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:
    Post::whereHas('international_post_en', function($q) {
           $q->where('is_published', 1);
      })->where(function ($q) {
         $q->whereHas('categories', function($q) {
           $q->where('name', 'test-one');
         })->orWhereHas('subcategories', function($q) {
           $q->where('name', 'test-two');
         });
      })->with('categories', 'subtags')->get();
    

    事实上,这是您linked 页面上的第一个示例。然而,这个例子是相当不准确的,因为你不会将and wheres 与or where 分组,而是反过来..

    【讨论】:

    • 好吧,对不起,我应该试试这个。我确信如果它是关于关系的,它就无法工作。谢谢你,它就像我想要的那样工作。
    • 只是为了避免另一个帖子,你知道我是否可以将 first() 方法应用于带有约束的急切加载吗?
    • 您是指整个查询的first 而不是get?当然可以。
    • 不,仅在 with 方法上。在我的示例中,我只想获取第一个“子标签”,并且 with 方法返回一个多维数组。所以我只会将 first() 方法应用于这种情况而不是整个查询
    • 不,它不会起作用并且会导致意想不到的结果。阅读此stackoverflow.com/a/24350807/784588
    猜你喜欢
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    相关资源
    最近更新 更多