2015-05-03 2 views
0

В последнее время я начал использовать Propel (PHP ORM), и мне это нравится, но у меня есть одна довольно неприятная проблема, которую я не могу решить даже при большом количестве попыток. Я использую обратную инженерию для создания моего schema.xml, который отлично работает, пока не придет к объединению. К сожалению, для всех моих внешних ключей обратная инженерия добавляет только name, а не атрибут phpName. Что бы я ни пытался использовать этот атрибут name для соединения, я терпит неудачу. После того, как я вручную добавил атрибут phpName (а затем, конечно, перестроил модели), соединение работает отлично, как должно.Использование атрибута name для объединений Propel

Вот фрагмент внешнего ключа в schema.xml (без атрибута phpName очевидно):

<foreign-key foreignTable="users" name="messages_ibfk_1"> 
    <reference local="creating_user_id" foreign="id"/> 
</foreign-key> 

А вот код для моего присоединиться (который не работает):

$messages = MessagesQuery::create()->joinWith('messages_ibfk_1')->findByRecipientId($id); 

Я пробовал все виды вариаций для значения joinWith, но никто не работал. В верхней части схемы эта настройка активна: defaultPhpNamingMethod="underscore"

передвижение ошибки вытаскивает является: Unknown relation messages_ibfk_1 on the Messages table.

Если я добавляю phpName attribut со значением Author объединения работает отлично так:

$messages = MessagesQuery::create()->joinWith('Author')->findByRecipientId($id); 

Поскольку у меня много внешних ключей, и я хочу работать с минимальной/никакой ручной работой, вопрос: как мне решить эту проблему, не добавляя все атрибуты phpName вручную. Либо я нахожу способ доступа к внешним ключам с их обычным атрибутом имени, либо есть способ сообщить, что propel установит атрибут phpName при построении моделей?

Надеюсь, у кого-то есть идея, это будет отличная помощь! :)

ответ

0

foreign-key s name атрибут используется только для миграции схемы, а не для использования в вашем реальном PHP-коде. Так как вы определяете везде полезный phpName или продлить MysqlSchemaParser, например, и добавить туда что-то вроде:

$fk->setPhpName($name); 

https://github.com/propelorm/Propel2/blob/master/src/Propel/Generator/Reverse/MysqlSchemaParser.php#L349

Вы можете использовать этот новый обратный класс, используя свойство migration.parserClass конфигурации. Дополнительная информация здесь http://propelorm.org/documentation/reference/configuration-file.html#reverse-engeneering. Имейте в виду: если вы измените это свойство, вы больше не сможете передать DSN для команды database:reverse. Вам необходимо передать ему имя соединения, определенное в вашей настройке прогона под propel.database.connections.

+0

Большое спасибо за ваш полезный ответ, особенно все детали. Я могу попробовать ваше решение в будущем. Поскольку я не получил ответа в течение нескольких дней, я помог себе, написав крошечный инструмент командной строки, который добавляет атрибут phpName для каждого внешнего ключа в схеме.Немного грустно, что это не может быть активировано простым параметром, хотя я думаю, но это, конечно, не ваша вина. Ваша помощь очень ценится, спасибо снова. – bobinrinder

0

Имя messages_ibfk_1 относится к наименованию индекса в вашей физической таблице, а не к отношению/таблице. joinWith() требует имя таблицы, в этом случае оно должно быть joinWith('users'), которое, согласно вашему определению схемы, является внешней таблицей.

Так правильно synax должно быть: $messages = MessagesQuery::create()->joinWith('users')->findByRecipientId($id);

+0

Спасибо за ваш ответ, к сожалению, это не работает. Я не знаю, работает ли это вообще или просто потому, что у меня есть несколько внешних ключей, указывающих на одну и ту же таблицу. – bobinrinder

Смежные вопросы