Доктрина 1 и несколько первичных ключей, возможно ли это? - PullRequest
0 голосов
/ 05 августа 2011

Могу ли я иметь несколько первичных ключей с Doctrine 1?Если нет, то какие обходные пути?

Ответы [ 3 ]

0 голосов
/ 05 августа 2011

В руководствах по доктрине об этом ничего не говорится, но Symfony (1.2) кратко охватывает это в своем руководстве (Symfony использует доктрину в качестве ORM по умолчанию).

$userGroup = Doctrine::getTable('UserGroup')->find(array(1, 2));

Я не могу понять, почему доктрина не поддерживает составные первичные ключи, поскольку вы можете объявить модели для соединительной таблицы, которая фактически состоит из составных первичных ключей.

0 голосов
/ 11 июня 2015

Да, вы можете. Но он не имеет много документации. Например, если мы хотим, чтобы у сущности Пользователь было много Местоположений, а у Местоположений было много Пользователей, то вам нужно что-то вроде этого:

В методе настройки вашей модели User вы указали:

$this->hasMany('Location as Locations', array(
    'refClass' => 'UserLocation', //Refering to the relation table
    'local' => 'user_id', //the user id in the realtion table
    'foreign' => 'location_id' //the location id in the relation table
));

В методе установки модели местоположения вы положили это:

$this->hasMany('User as Users', array(
    'refClass' => 'UserLocation',
    'local' => 'location_id',
    'foreign' => 'user_id'
));

В методе установки модели отношения «многие ко многим» (UserLocation) вы можете поместить это:

$this->hasMany('User', array(
     'local' => 'user_id',
     'foreign' => 'id'));

$this->hasMany('Location', array(
     'local' => 'location_id',
     'foreign' => 'id'));

Теперь, если вы хотите выполнить Doctrine_Query и получить всех пользователей с идентификатором местоположения: 12, это будет что-то вроде:

$q = Doctrine_Query::create()
     ->select("u.*")
     ->from('User u')
     ->leftJoin("u.UserLocation ul") 
     ->where('ul.location_id = ?',12);

Если вы вставляете пользователя, не забудьте также создать объект UserLocation, что-то вроде этого:

$userLocation = new UserLocation();
$userLocation->location_id = $locationId;
$userLocation->last_login = date('Y-m-d H:i:s');
$userLocation->user_id = $user->id; //from the user you created before
$userLocation->save();
0 голосов
/ 05 августа 2011

В таблице всегда есть 1 первичный ключ (ограничение баз данных)
Вместо этого вы можете использовать уникальные ключи (я не знаю, как насчет поддержки уникальных ключей в доктрине. Посетите руководство на сайте доктрины )

...