WordPress is generating the tax query for you – when you register a custom taxonomy, it also registers what’s known as a query var. This is a “key”-type value that means you can simply do this:
new WP_Query([ 'age_from' => 2 ]);
… and WP will transform that to:
WP_Tax_Query([
[
'taxonomy' => 'age_from',
'terms' => 2,
'field' => 'slug',
]
]);
…but not before pre_get_posts
fires (it happens on line 2802
of wp-includes/query.php
). My suggestion would be to use a direct tax query in your arguments, rather than taxonomy query vars, so you have complete control over the relationship:
$args = array(
'post_type' => 'place',
'post_status' => 'publish',
'orderby' => 'date',
'tax_query' => array(
'relation' => 'AND',
array(
'relation' => 'OR',
array(
'taxonomy' => 'age_from',
'terms' => '2',
),
array(
'taxonomy' => 'age_to',
'terms' => '5',
),
),
array(
'relation' => 'AND',
array(
'taxonomy' => 'place_caregivers',
'terms' => 'no',
),
array(
'taxonomy' => 'place_type',
'terms' => 'indoor',
),
array(
'taxonomy' => 'daddy_lounge',
'terms' => 'no',
),
),
),
);
Read about “nested” relations in WordPress 4.1