app/Services/SearchService.php
public function searchFamilyNames(array $trees, array $search, int $offset = 0, int $limit = PHP_INT_MAX): Collection
    {
        $query = DB::table('families')
            ->leftJoin('name AS husb_name', static function (JoinClause $join): void {
                $join
                    ->on('husb_name.n_file', '=', 'families.f_file')
                    ->on('husb_name.n_id', '=', 'families.f_husb')
                    ->where('husb_name.n_type', '<>', '_MARNM');
            })
            ->leftJoin('name AS wife_name', static function (JoinClause $join): void {
                $join
                    ->on('wife_name.n_file', '=', 'families.f_file')
                    ->on('wife_name.n_id', '=', 'families.f_wife')
                    ->where('wife_name.n_type', '<>', '_MARNM');
            });

        $prefix = DB::connection()->getTablePrefix();
        $field  = DB::raw('COALESCE(' . $prefix . "husb_name.n_full, '') || COALESCE(" . $prefix . "wife_name.n_full, '')");

        $this->whereTrees($query, 'f_file', $trees);
        $this->whereSearch($query, $field, $search);

        $query
            ->orderBy('husb_name.n_sort')
            ->orderBy('wife_name.n_sort')
            ->select(['families.*', 'husb_name.n_sort', 'wife_name.n_sort'])
            ->distinct();

        return $this->paginateQuery($query, Family::rowMapper(), GedcomRecord::accessFilter(), $offset, $limit);
    }
public function searchFamilyNames(array $trees, array $search, int $offset = 0, int $limit = PHP_INT_MAX): Collection
    {
        $query = DB::table('families')
            ->leftJoin('name AS husb_name', static function (JoinClause $join): void {
                $join
                    ->on('husb_name.n_file', '=', 'families.f_file')
                    ->on('husb_name.n_id', '=', 'families.f_husb')
                    ->where('husb_name.n_type', '<>', '_MARNM');
            })
            ->leftJoin('name AS wife_name', static function (JoinClause $join): void {
                $join
                    ->on('wife_name.n_file', '=', 'families.f_file')
                    ->on('wife_name.n_id', '=', 'families.f_wife')
                    ->where('wife_name.n_type', '<>', '_MARNM');
            });

        $prefix = DB::connection()->getTablePrefix();
        $field  = DB::raw('COALESCE(' . $prefix . "husb_name.n_full, '') || COALESCE(" . $prefix . "wife_name.n_full, '')");

        $this->whereTrees($query, 'f_file', $trees);
        $this->whereSearch($query, $field, $search);

        $query
            ->orderBy('husb_name.n_sort')
            ->orderBy('wife_name.n_sort')
            ->select(['families.*', 'husb_name.n_sort', 'wife_name.n_sort'])
            ->distinct();

        return $this->paginateQuery($query, Family::rowMapper(), GedcomRecord::accessFilter(), $offset, $limit);
    }
public function searchFamilyNames ( array $ trees , array $ search , int $ offset = 0 , int $ limit = PHP_INT_MAX ) : Collection { $ query = DB :: table ( 'families' ) -> leftJoin ( 'name AS husb_name' , static function ( JoinClause $ join ) : void { $ join -> on ( 'husb_name.n_file' , '=' , 'families.f_file' ) -> on ( 'husb_name.n_id' , '=' , 'families.f_husb' ) -> where ( 'husb_name.n_type' , '<>' , '_MARNM' ) ; } ) -> leftJoin ( 'name AS wife_name' , static function ( JoinClause $ join ) : void { $ join -> on ( 'wife_name.n_file' , '=' , 'families.f_file' ) -> on ( 'wife_name.n_id' , '=' , 'families.f_wife' ) -> where ( 'wife_name.n_type' , '<>' , '_MARNM' ) ; } ) ; $ prefix = DB :: connection ( ) -> getTablePrefix ( ) ; $ field = DB :: raw ( 'COALESCE(' . $ prefix . "husb_name.n_full, '') || COALESCE(" . $ prefix . "wife_name.n_full, '')" ) ; $ this -> whereTrees ( $ query , 'f_file' , $ trees ) ; $ this -> whereSearch ( $ query , $ field , $ search ) ; $ query -> orderBy ( 'husb_name.n_sort' ) -> orderBy ( 'wife_name.n_sort' ) -> select ( [ 'families.*' , 'husb_name.n_sort' , 'wife_name.n_sort' ] ) -> distinct ( ) ; return $ this -> paginateQuery ( $ query , Family :: rowMapper ( ) , GedcomRecord :: accessFilter ( ) , $ offset , $ limit ) ; }
Search for families by name.

@param Tree[]   $trees
@param string[] $search
@param int      $offset
@param int      $limit

@return Collection
@return Family[]
Search for families by name .