Автоинкремент для каждого пользователя

У меня есть таблица со счетами. Каждый счет принадлежит пользователю.

Таким образом, таблица table имеет столбцы id, user_id.

Мне нужен третий столбец, например, invoice_id, который автоматически увеличивается в зависимости от пользователя.

Так, например, пользователь 1 будет иметь счета с id 1,2,3,4,5,6,7,8..., а пользователь 2 также будет иметь счета с id 1,2,3,4,5,6,7,8....

Я знаю, что могу создать функцию, которая проверяет последнее значение для конкретного пользователя и назначает следующее, но нет ли другого «более простого» более правильного способа сделать это с помощью cakephp или mysql?


person user3504209    schedule 07.04.2014    source источник
comment
Может быть, это то, что вы ищете? stackoverflow.com/ вопросы/979709/   -  person Duikboot    schedule 07.04.2014
comment
В зависимости от используемого механизма базы данных вы можете воспользоваться составным первичным ключом с автоинкрементом — dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html — хотя я считаю, что это доступно только с MyISAM и BDB двигатели для MySQL .... Вы не указываете, какую базу данных вы используете, поэтому я предполагаю, что MySQL   -  person Mark Baker    schedule 07.04.2014
comment
Я тоже видел этот метод, но я предпочитаю не использовать метод, специфичный только для MyISAM.   -  person user3504209    schedule 07.04.2014
comment
Нет никакой причины, кроме эстетической, когда вы хотите иметь красивую последовательную нумерацию на основе пользователя. Однако, поскольку люди есть люди и нам часто нравятся бесполезные вещи — вы выполняете это с помощью триггеров AFTER INSERT в таблице инвойсов. Что касается того, как, существует множество примеров того, как использовать триггеры MySQL. Однако поверьте мне, когда я говорю по опыту - вам это не нужно и не нужно.   -  person N.B.    schedule 07.04.2014
comment
Что ж, это необходимо, потому что каждый пользователь может просматривать свой счет и идентификатор счета. И я не хочу, чтобы пользователь видел такие идентификаторы, как 1,4, 9,16..   -  person user3504209    schedule 07.04.2014
comment
Вот и все, пользы никакой, кроме эстетической. Является ли идентификатор 1 или 1021031231, абсолютно не имеет значения - это число, в конечном итоге оно работает одинаково, за исключением того, что вы думаете, что это выглядит приятнее для пользователя. Реализовать это безопасно — это совсем другое, и, поскольку у вас практически нет преимуществ, и вы навязываете ошибки (на самом деле реализовать это безопасно, как вы могли подумать сначала, я научился на собственном горьком опыте).   -  person N.B.    schedule 07.04.2014


Ответы (2)


вы должны сделать это в обратном вызове beforeSave в вашей модели Invoice

что-то типа:

public function beforeSave($options = array())
{

    if(!$this->id)
    {
        $user_id = $this->data['Invoice']['user_id'];
        $invoice = $this->find(
            'first', 
            array
            (
                'fields' => array('MAX(invoice_id) AS invoice_id'),
                'conditions' => array('Invoice.user_id' => $user_id )
            )
        );
        $invoice_id = $invoice [0]['invoice_id'] + 1 ;


        $this->data['Invoice']['invoice_id'] = $invoice_id ;
    }
    return true;
}

Приведенный выше код должен работать. В любом случае, я почему-то не уверен, что это лучший способ добиться этого, поэтому продолжайте искать другие решения.

person arilia    schedule 07.04.2014

В вашей схеме добавьте

$t->addColumn('id', [
    'type' => 'integer',
    'autoIncrement' => true,
])
person user3505541    schedule 07.04.2014
comment
Это не сработает, так как у пользователя 1, например, будет счет 1,2,4,8, а у пользователя 2 будет 3,5,6,7.. - person user3504209; 07.04.2014