生成独特的slug Codeigniter 3&& MySQL的

时间:2016-09-07 22:49:01

标签: php codeigniter

我需要使用以下代码根据用户输入生成唯一的slug:

public function create_slug($id, $name){

    $count = null;
    $name = url_title($name);
    while(true) {
        $this->db->select('id');
        $this->db->where('id !=', $id);
        $this->db->where('slug', $name);
        $query = $this->db->get('users');
        if ($query->num_rows() == 0) {
            break;
        } else {
            $name .= '-' . (++$count);
        }
    }
    return $name;
}

它选择所有加工slu(($name)的东西,除了它自己的slu .. 第一个用户输入的结果 - 123是slug - 123。对于第二个相同的输入,slug是123-1,但是具有相同文本的第三个输入是结果123-1-2,这不是我想要的。

我尝试了另一种方式:

public function create_slug($id, $name){
    $count = null;
    $name = url_title($name);
    $this->db->select('id');
    $this->db->where('id !=', $id);
    $this->db->where('slug', $name);

    $query = $this->db->get('users');

    if($query->num_rows()){
        $count = '-' . ($query->num_rows() + 1);
    }
    return $name . $count;
}

这里是相同的查询,但计数行+ 1。 对于第一个123,slu is是123; 第二个123,slu 123-2; 第三个123,再次出现123-2,这不是唯一的。

如何创建基于某些用户输入的slug并且是唯一的,如果有值为name的slug,则next为name-1,如果再次为next,则为{{1} }} 等等。 ?

1 个答案:

答案 0 :(得分:2)

您需要根据原始名称创建temp slug_name,并测试slug_name。如果失败,请根据原始名称重新创建新的slug_name。成功(中断循环)返回修改后的slug_name。

public function create_slug($id, $name)
{
    $count = 0;
    $name = url_title($name);
    $slug_name = $name;             // Create temp name
    while(true) 
    {
        $this->db->select('id');
        $this->db->where('id !=', $id);
        $this->db->where('slug', $slug_name);   // Test temp name
        $query = $this->db->get('users');
        if ($query->num_rows() == 0) break;
        $slug_name = $name . '-' . (++$count);  // Recreate new temp name
    }
    return $slug_name;      // Return temp name
}

或者像使用count_all_results一样。删除了你的id检查以及我认为slug需要对整个表格都是唯一的。

public function create_slug($id, $name)
{
    $count = 0;
    $slug_name = $name = url_title($name);
    while(true) 
    {
        $this->db->from('users')->where('slug', $slug_name);
        if ($this->db->count_all_results() > 0) break;
        $slug_name = $name . '-' . (++$count);
    }
    return $slug_name;
}