db->prepare( 'SELECT * FROM %i WHERE `id` = %d LIMIT 1', $this->table( 'carts' ), $id ); $row = $this->db->get_row( $sql, ARRAY_A ); return is_array( $row ) ? $this->hydrate( $row ) : null; } /** * {@inheritDoc} * * @param Uuid $uuid Parameter. */ public function find_by_uuid( Uuid $uuid ): ?Cart { $sql = $this->db->prepare( 'SELECT * FROM %i WHERE `uuid` = %s LIMIT 1', $this->table( 'carts' ), $uuid->to_string() ); $row = $this->db->get_row( $sql, ARRAY_A ); return is_array( $row ) ? $this->hydrate( $row ) : null; } /** * {@inheritDoc} * * @param int $order_intent_id Parameter. */ public function find_by_order_intent_id( int $order_intent_id ): ?Cart { $sql = $this->db->prepare( 'SELECT * FROM %i WHERE `order_intent_id` = %d LIMIT 1', $this->table( 'carts' ), $order_intent_id ); $row = $this->db->get_row( $sql, ARRAY_A ); return is_array( $row ) ? $this->hydrate( $row ) : null; } /** * {@inheritDoc} * * @param Cart $cart Parameter. */ public function save( Cart $cart ): void { $data = [ 'uuid' => $cart->uuid()->to_string(), 'order_intent_id' => $cart->order_intent_id(), 'status' => $cart->status()->value, 'created_at' => $this->format_datetime( $cart->created_at() ), 'updated_at' => $this->format_datetime( $cart->updated_at() ), ]; if ( null === $cart->id() ) { $this->db->insert( $this->table( 'carts' ), $data ); $cart->assign_id( $this->last_insert_id() ); return; } $this->db->update( $this->table( 'carts' ), $data, [ 'id' => $cart->id() ] ); } /** * Map a database row to an entity. * * @param array $row Database row. */ private function hydrate( array $row ): Cart { return new Cart( (int) $row['id'], new Uuid( (string) $row['uuid'] ), (int) $row['order_intent_id'], CartStatus::from( (string) $row['status'] ), $this->parse_datetime( (string) $row['created_at'] ), $this->parse_datetime( (string) $row['updated_at'] ), ); } }