2016-06-16 9 views
1

私は記事のタイトルに基づいてユニークなスラグを生成する必要があります。一致するナメクジについては、ナンバーを最後に追加してユニークにしたいと思っています。私の周り見つけ働く私は他の人に基づいて、この機能を作った:Laravel - 記事タイトルからユニークなスラッグを正しく生成する方法は?

static function slugify($title) 
    { 
     $slug = str_slug($title, '-'); 
     //THIS IS THE PROBLEMATIC LINE: 
     $common = Article::whereRaw("slug RLIKE '^{$slug}(-[0-9]+)?$'")->orderBy('slug', 'desc')->get(); 
     $count = count($common); 
     if($count > 0){ 
        $last = $common[0]; 
        $broken = explode('-', $last->slug); 
        $num = $broken[count($broken)-1]; 
        $num = intval($num) + 1; 
        return $slug.'-'.$num; 
     } else 
      return $slug.'-1'; 
    } 

問題: 私はスラグに文字列を変換しますLaravelのstr_slug機能を使用して新しいナメクジを生成しようと見ることができるように形。次に、データベースから既存のスラッグを照会し、それらを降順(高い>低い)に順序付けし、順序付けされたセット内で最高のものを取ることを試みる。 問題は、MySQLがもちろん文字列として注文しているからです。slug-title-9は実際にはslug-title-10より高いと考えられます。終わり。どうすればこの作品を作れますか?最後の数字に基づいて注文する方法はありますか、間違った方向に行くのですか?私は避けたい

ソリューション:

私は人々が、一度にすべてのsimmilarナメクジを照会し、それらをカウントし、新しいスラグの終わりに数+ 1を追加し、他の実装を見てきました。 いくつかの記事を削除すると、全体の数が少なくなり、新しいスラッグが古いものと競合する可能性があるため、これは悪いことです。

人がスラッグの終わりに1を追加し、それが存在するかどうかを確認する実装があります。存在する場合は、代わりに2を追加し、存在するかどうかを確認してください。たとえば、slug-title-9が存在します。 IMOデータベースに不必要な負荷がかかっているため、これは悪いことです。

私が取り組んでいるプロジェクトでは、しばしば一致するスラグに遭遇する潜在的可能性があるため、まともな解決策が必要です。

+6

なぜ単に記事IDを追加するのはオプションではないのですか?ユニークであることが保証され、頭痛を軽減します。 –

+0

@TadasPaplauskasうわー...私はそれを考えていなかったから...ありがとう:) – PeterTheLobster

+0

@TadasPaplauskas何かを理解するのを助けてくれますか?PDO :: lastInsertIdのようなものを呼び出すと、このセッションに最後に挿入されたIDが返されますか?たとえば、2人のユーザーが同時に行を挿入する関数を呼び出した場合、間違ったIDを返すことはありませんでした。 – PeterTheLobster

答えて

1

lastInsertIdは、接続ごとのIDを返します。これは、同時SQL接続が相互に干渉しないことを意味します。

しかし、lastInsertId()は、おそらくあなたのやりたいことに最適なアプローチではありません。私はあなたがすでにEloquentモデルを使っているのを見ています。テーブルに新しいエントリを作成するとき、それらのモデルは対応するオブジェクトを返します。そして、あなたは混乱することなくそのオブジェクトのIDを得ることができます。

これは常に正しい記事IDを出力し、実装の詳細を心配する必要はありません。私は、現代のWebフレームワークでlastInsertIdを使用する正当な理由は見当たりません。

一般的には、アプリケーションのデータベースを直接扱うことを避け、フレームワークが提供する抽象化を使用してください。これにより、コードの保守性が向上し、理解しやすくなります。

P.S.それは重要ではないかもしれませんが、lastInsertId()はトランザクションでは機能しません。

関連する問題