MB: Repository Objekte aus DB abspeichern

Beitrag lesen

moin,

wenn ich einen User-Objekt aus der Database über ein UserRepository haben möchte, jedoch findet die Database einfach keinen angeforderten Record, dann wird zwangsläufig ein Fehler auftreten, weil das System keinen TUser fetcht sondern null zurück gibt. Und Ich möchte sehr gern mit Return-Type arbeiten können.

class UserRepository {
  
  public function findByPseudo( string $pseudo ) : TUser {
    $this->_database->fetchAssoc(); // FETCH_CLASS TUser wird noch kommen
    
    $items = $this->_database->get(
      "SELECT * FROM {$this->_table}"
      ." WHERE pseudo = '{$pseudo}';",
      [ $pseudo ]
    );
    
    return new TUser(
      $items[ 'first' ],
      $items[ 'last' ],
      $items[ 'email' ],
      $items[ 'pseudo' ],
      $items[ 'role' ],
      $items[ 'hash' ]
    );
  }
}

$user_repo = new UserRepository;
$user = $user_repo->findByPseudo( 'mb' ); // Error fals nicht existiert

Um dem Problem Herr zu werden könnte ich eine Existenz-Abfrage vorher machen was ich gemacht habe…

class UserRepository {
  
  public function existPseudo( string $pseudo ) : bool {
    $this->_database->fetchAssoc();
    
    return !empty( $this->_database->getAll(
      "SELECT pseudo FROM {$this->_context}"
      ." WHERE pseudo = ?;",
      [ $pseudo ]
    ) );
  }
  
  public function findByPseudo( string $pseudo ) : TUser {
    // ...
  }
}

$user_repo = new UserRepository;
if( $user_repo->existPseudo( 'mb' ) ) {
  $user = $user_repo->findByPseudo( 'mb' );
}

…aber das frisst denke ich mal Systemzeit zweimal eine Verbindung zur Database aufzubauen und Anfragen anzustrengen. Wäre eine Art TUser Property im Repository möglich sodass diese Existns-Abfrage überflüssig wird? wie…

class UserRepository {
  
  private $user = null;
  
  public function findByPseudo( string $pseudo ) : void {
    $this->_database->fetchAssoc(); // FETCH_CLASS TUser wird noch kommen
    
    $items = $this->_database->get(
      "SELECT * FROM {$this->_table}"
      ." WHERE pseudo = '{$pseudo}';",
      [ $pseudo ]
    );
    
    $this->_user = is_null( $items )
      ? new TUser(
        $items[ 'first' ],
        $items[ 'last' ],
        $items[ 'email' ],
        $items[ 'pseudo' ],
        $items[ 'role' ],
        $items[ 'hash' ]
      )
      : null;
  }
}

$user_repo = new UserRepository;
$user = $user_repo->findByPseudo( 'mb' );
if( !is_null( $user ) {
  // Code
}

Bevor ich was wirklich dämliches mache möchte und den ganzen Codew umstruktuieren möchte ich erstmal Fragen.

lgmb