Обновление модели «Свойства» при добавлении новой записи в CakePHP - PullRequest
0 голосов
/ 27 апреля 2010

Я пишу приложение в CakePHP, которое сейчас будет использоваться для составления цитат для клиентов. Так что Цитата это модель. Я хочу иметь отдельную модель / таблицу для чего-то вроде «Свойство», которое может использоваться другими моделями.

Каждый раз, когда пользователь попадает в действие «Добавить цитату», я в основном хочу вытянуть Свойство с именем «nextQuoteNumber» или что-то в этом направлении, а затем автоматически увеличивать это свойство, , даже если новая Цитата не является t сохранено. Так что я не думаю, что здесь уместно просто использовать автоинкремент для идентификатора котировки - также «номер цитаты» может отличаться от идентификатора строки.

Я знаю, что это достаточно просто сделать, но я пытаюсь найти "правильный" способ CakePHP сделать это! Я думаю, что у меня должен быть метод внутри модели Property, скажем «getProperty ($ property_name)», который будет извлекать значение для возврата, а также увеличивать значение ... но я не уверен, что лучший способ или как вызвать этот метод из контроллера Quotes.

Что мне делать? Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

Я закончил тем, что сделал что-то более конкретное, создав модель для «Последовательности», а не для более общего «Свойства». Последовательность имеет три поля: идентификатор, имя, значение. Поскольку в настоящее время мне нужна последовательность для кавычек, начинающаяся с 1001, есть одна строка (1, 'Quote', 1001).

В файле модели sequence.php имеет следующий вид:

class Sequence extends AppModel {
var $name = 'Sequence';

function getNext($sequenceName) {
    // Make this a transaction, so two concurrent requests can't get the same value.
    $this->begin();
    // Find the sequence for the given object, let's say 'Quote'
    $row = $this->find('first', array(
        'conditions' => array('Sequence.name' => $sequenceName),
        'fields' => array('id', 'value'),
    ));
    // Save the original value (before incrementing) so we can return it.
    $value = $row['Sequence']['value'];
    // Update the value in the database.
    $row['Sequence']['value'] = $value + 1;
    $this->save($row);
    // Commit the changes to the database, ending the lock.
    $this->commit();
    return $value;
} 

Как указывалось в webbiedave, атомарность требуется или возможно, чтобы два пользователя / цитаты могли получить одинаковый порядковый номер, следовательно, вызовы begin () и commit ()

Затем в свой quotes_controller я добавил следующее в действии add ():

$this->loadModel('Sequence');
$quoteNumber = $this->Sequence->getNext('Quote');

Тогда я могу использовать $ quoteNumber по своему желанию.

Надеюсь, это кому-нибудь поможет, и, пожалуйста, помогите, если есть лучший способ сделать это. Спасибо!

0 голосов
/ 27 апреля 2010

Ваш первоначальный подход приведет к дублированию номеров кавычек, если вы не используете блокировку каким-либо образом.

Когда пользователь переходит на страницу «Добавить цитату», вы создаете новую строку в таблице котировок, захватываете идентификатор и добавляете его на страницу. Когда пользователь отправит цитату, обновите строку с новой информацией.

Было бы тривиально отфильтровывать пустые кавычки из ваших запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...