Почему бы просто не сделать вашу базу ContactableEntity бетонной?
РЕДАКТИРОВАТЬ:
Только что провел несколько экспериментов в моем проекте, который использует CTI.Я не вижу причин, по которым та же стратегия не будет работать с STI.
По сути, у меня есть что-то вроде:
/**
* Base class for orders. Actual orders are some subclass of order.
*
* @Entity
* @Table(name="OOrder")
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"CAOrder" = "CAOrder", "AmazonOrder" = "AmazonOrder"})
*/
abstract class Order {
/**
* CSRs can add notes to orders of any type
* @OneToMany(targetEntity = "OrderNote", mappedBy = "order", cascade={"all"})
* @OrderBy({"created" = "ASC"})
*/
protected $notes;
// ...
}
/**
* @Entity
*/
class AmazonOrder extends Order {
/**
* @Column(type="string", length="20")
*/
protected $amazonOrderId;
// ...
}
/**
* @Entity
*/
class OrderNote {
// ...
/**
* @ManyToOne(targetEntity="Order", inversedBy="notes")
*/
protected $order;
// ...
}
И, похоже, она работает точно так, как ожидалось.Я могу получить OrderNote, и его свойство $order
будет содержать некоторый подкласс Order.
Существуют ли ограничения на использование STI, которые делают это невозможным для вас?Если так, я бы предложил перейти в CTI.Но я не могу представить, почему это не сработает с ИППП.