Взаимосвязи в базе данных CodeIgniter

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

Это мой метод:

public function add()
{
    // Field Rules
    $this->form_validation->set_rules('title', 'Title', 'trim|required|min_length[3]');
    $this->form_validation->set_rules('body', 'Body', 'trim|required');
    $this->form_validation->set_rules('status', 'Status', 'required');
    $this->form_validation->set_rules('is_featured', 'Feature', 'required');
    $this->form_validation->set_rules('is_commented', 'Comments', 'required');
    $this->form_validation->set_rules('order', 'Order', 'integer');

    if ($this->form_validation->run() == FALSE) {

        // Select Categories    
        $categories_options = array();
        $categories_options[0] = 'Select Categories';

        $categories_list = $this->Terms_model->get_list();

        foreach($categories_list as $cat){
            $categories_options[$cat->term_id] = $cat->title;
        }

        $data['categories_options'] = $categories_options;

        // Select Post Author ID and Name
        $user_options = array();
        $user_options[0] = 'Select Username ID';

        $user_list = $this->User_model->get_list();

        foreach($user_list as $username){
            $user_options[$username->id] = $username->username;
        }

        $data['user_options'] = $user_options;

        // Load template
        $this->template->load('admin', 'default', 'posts/add', $data);
    } else {
        $slug = str_replace(' ', '-', $this->input->post('title'));
        $slug = strtolower($slug);

        // Upload Image
        $config['upload_path'] = 'assets/img/posts/';
        $config['allowed_types'] = 'gif|jpg|png';
        $config['encrypt_name'] = TRUE;
        $config['max_size'] = '2048';
        $config['max_width'] = '2000';
        $config['max_height'] = '2000';
        $this->load->library('upload', $config);
        $this->upload->initialize($config);


        $file_name = 'post_image';

        if (!$this->upload->do_upload($file_name)){
            varDebug($this->upload->display_errors());
            $file_name = 'assets/img/noimage.jpg';
        } else {
            $post_image =  $this->upload->data('file_name');
        }

        // Page Data
        $data = array(
            'user_id'       => $this->input->post('user_id'),
            'slug'          => $slug,
            'title'         => $this->input->post('title'),
            'post_image'    => $post_image,
            'body'          => $this->input->post('body'),
            'status'        => $this->input->post('status'),
            'is_featured'   => $this->input->post('is_featured'),
            'is_commented'  => $this->input->post('is_commented'),
            'order'         => $this->input->post('order'),
            'type'          => 'post',
        );

        // Insert Page
        $this->Post_model->add($data);

        $post_id = $this->db->insert_id();

        // Activity Array
        $data = array(
            'resource_id' => $post_id,
            'type'        => 'post',
            'action'      => 'added',
            'user_id'     => $this->session->userdata('user_id'),
            'message'     => 'A new post was added (' . $data["title"] . ')'
        );

        // Insert Activity
        $this->Activity_model->add($data);

        // Insert Categories into CI_TERMS_TAXONOMY - term_taxonomy_id, term_id, type, body, parent_id, count
        $categories = $this->Terms_model->get_list();
        foreach ($categories as $cat) {
            $data = array(
                'term_taxonomy_id'  => $this->db->insert_id(),
                'term_id'           => $cat->term_id,
                'type'              => 'category',
            );
        }

        $this->Taxonomy_model->add($data);


        // Insert Categories into CI_TERMS_RELATIONSHIP - post_id, term_taxonomy_id, term_order
        $taxonomies = $this->Taxonomy_model->get_list();

        $data = array();

        foreach ($taxonomies as $taxonomy){
            $data[] = array(
                'post_id'           => $post_id,
                'term_taxonomy_id'  => $taxonomy->term_taxonomy_id,
            );
        }

        $this->db->insert_batch('ci_terms_relationship', $data);

        // Set Message
        $this->session->set_flashdata('success', 'Post has been added');

        // Redirect
        redirect('admin/posts');
    }
}

В большей части кода все работает хорошо, я имею в виду, что могу вставить сообщение в его таблицу, затем я добавляю категории в таблицу ci_taxonomy, и все работает нормально. Проблема возникает, когда я пытаюсь добавить текущий идентификатор к post_id в CI_relationship Таблица.

Прямо сейчас это вызывает у меня только эту ошибку:

Duplicate entry '0-1' for key 'PRIMARY'

INSERT INTO 'ci_terms_relationship' ('post_id', 'term_taxonomy_id') VALUES (0,'1'), (0,'2'), (0,'3'), (0,'4'), (0,'5'), (0,'6'), (0,'7'), (0,'8'), (0,'9')

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

Я надеюсь, что смогу прояснить это.

Заранее спасибо.

Я не уверен, понимаю ли я ваш вопрос: если вы получаете сообщение об ошибке «дублирующаяся запись», это означает, что вы пытаетесь сделать INSERT на чем-то существующем. Вместо этого вам может понадобиться ОБНОВЛЕНИЕ, может ли это быть причиной?

Vickel 16.03.2018 23:25

@Kevin, вы заметили, что ваш post_id равен 0? Одно предложение, вместо использования $ this-> db-> insert_id () в вашем контроллере, что опасно, пусть функции модели возвращают вместо этого идентификатор и используют возвращаемое значение.

TimBrownlaw 17.03.2018 01:31

Привет, @TimBrownlaw, извините за поздний ответ, но на самом деле я просто передал $this->db->insert_id() как переменную, и он начал давать мне те результаты, которые я хотел ... проверьте мою обновленную версию.

Kirasiris 17.03.2018 09:34

эй, @Vickel, извини за путаницу, я даже не был уверен, что кто-то вообще поймет вопрос (я действительно не приложил усилий, так как я торопился с реальными вещами), что просто заставило меня написать несколько абзацев без думаю об этом ... опять извините за путаницу .... и нет, я не пытался обновляться.

Kirasiris 17.03.2018 09:39

@kevin Я больше говорил о том, чтобы метод модели возвращал идентификатор. Id> 0 в случае успеха, id = 0 в случае неудачи. Итак, $ post_id = $ this-> Post_model-> add ($ data); где $ this-> db-> insert_id (); возвращается в случае успеха и 0 в случае неудачи. Храните данные БД внутри самого метода модели.

TimBrownlaw 17.03.2018 10:41

что-то вроде этого? (это мой метод добавления в модели) `public function add ($ data) {$ this-> db-> insert ($ this-> table, $ data); if ($ this-> db-> insert_id ()> 0) {вернуть $ this-> db-> insert_id (); } else {вернуть ложь; }} `

Kirasiris 17.03.2018 11:24

@kevin Так лучше ... в этом больше смысла?

TimBrownlaw 17.03.2018 13:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
66
0

Другие вопросы по теме