<?
namespase Query;
$fo = function(){
  $id = 30;
  $query = Query::sql()
    ->select('t1.id,t1.name,t2.info AS descriptor')
    ->from('table1 AS t1')
      ->leftJoin('table3 AS t3')->on('t1.id=t3.id')->on('t2.reg',true),
    ->from('table2 AS t2')
    ->order('t1.name')
    ->where('t1.active=TRUE')
    ->where('t1.deleted',null,'!=')
    ->where('t1.id=t2.id')
    ->where('t1.type',[1,2])
    ->where((new \Query\Rules('or'))
      ->rule("t2.mode='add' ")
      ->rule('t2.info','описание','%')
    )
    ->where('t1.id',function() use($id){
        return Query::sql()->select('id')->from('table3')->where('chain_id',$id);
    })
    ->limit('2,20');
 
  return $query->Query;
};
 
  echo $fo();
?>


Функция вернёт такой запрос

SELECT
  t1.id,
  t1.name,
  t2.info AS descriptor
 
FROM
  table1 AS t1
      LEFT JOIN table3 AS t3 ON t1.id=t3.id AND t2.reg=TRUE,table2 AS t2,
  table2 AS t2
        
WHERE
  t1.active=TRUE AND 
  t1.deleted IS NOT NULL AND 
  t1.id=t2.id AND 
  t1.type IN (1,2) AND 
    (t2.mode='add' OR t2.info LIKE '%описание') AND 
  t1.id IN (
      SELECT
          id
      FROM table3
      WHERE chain_id IN (30)
  )
 
ORDER BY t1.name
LIMIT 2 OFFSET 20