Symfony app - how to add calculated fields to Propel objects?

前端 未结 5 938
清酒与你
清酒与你 2021-02-10 03:41

What is the best way of working with calculated fields of Propel objects?

Say I have an object \"Customer\" that has a corresponding table \"customers\" and each column

5条回答
  •  故里飘歌
    2021-02-10 04:01

    Propel actually builds an automatic function based on the name of the linked field. Let's say you have a schema like this:

    customer:
      id:
      name:
      ...
    
    order:
      id:
      customer_id: # links to customer table automagically
      completed: { type: boolean, default false }
      ...
    

    When you build your model, your Customer object will have a method getOrders() that will retrieve all orders associated with that customer. You can then simply use count($customer->getOrders()) to get the number of orders for that customer.

    The downside is this will also fetch and hydrate those Order objects. On most RDBMS, the only performance difference between pulling the records or using COUNT() is the bandwidth used to return the results set. If that bandwidth would be significant for your application, you might want to create a method in the Customer object that builds the COUNT() query manually using Creole:

      // in lib/model/Customer.php
      class Customer extends BaseCustomer
      {
        public function CountOrders()
        {
          $connection = Propel::getConnection();
          $query = "SELECT COUNT(*) AS count FROM %s WHERE customer_id='%s'";
          $statement = $connection->prepareStatement(sprintf($query, CustomerPeer::TABLE_NAME, $this->getId());
          $resultset = $statement->executeQuery();
          $resultset->next();
          return $resultset->getInt('count');
        }
        ...
      }
    

提交回复
热议问题