質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

2回答

3140閲覧

cakePHP3のバリテーションで自分の投稿の重複を拒否する方法

yajin

総合スコア75

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2016/07/02 07:41

Cakephp3で自分の投稿したタイトルが重複してた場合、「すでに登録されています」的なエラーを出したいと思っています。

現在、テーブルの全フィールドの中から、重複していた場合、見つけ出せるのですが、それではユーザ全員に適用されてしまいます。
user_idをwhere句に指定すればよいことは想像つくのですが、以下のプログラムを書いても

Table "App\Model\Table\PostsTable" is not associated with "request"と出ます。

public function exist($value, $context) { $table = $context['providers']['table']; //$query = $table->find(); //上の場合、全フィールドからの重複チェック $user_id = $this->request->session()->read('Auth.User.id'); $query = $table->find()->where('user_id',$user_id); //上2行を変えていきたい。 $query->where([$context['field'] => $value]); $count = $query->count(); return (bool) $count == 0; }

どのようにすればよいでしょうか。宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ログイン時とかに以下のようにセッションを登録している場合は

php

1//Controller.php 2// セッションにIDを保存 3$this -> Session -> write('id', $user -> id); 4

ログイン中のUserIdを以下で取得できます。

php

1//Controller.php 2$user_id = $this -> Auth -> user('id');

もしくは以下でもできると思います。

php

1//Controller.php 2$user_id= $this->Session->read('id');

参考文献
http://onlineconsultant.jp/pukiwiki/?Cake%20PHP%20%E7%8F%BE%E5%9C%A8%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BCID%E3%82%92%E5%8F%96%E5%BE%97
http://www.p-nt.com/technicblog/archives/9

投稿2016/07/06 02:08

XYZA

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yajin

2016/07/07 10:19

既存のauth.user.idとは別にもう一つsessionファイルに配列を作るという意味でしょうか。
XYZA

2016/07/08 01:27

私の理解不足で申し訳ありません $this -> Session -> write('id', $user -> id); は必要なく、 $user_id = $this -> Auth -> user('id'); のみで取得できます。 別に配列を作成する必要はありません。
yajin

2016/07/08 05:51

同様にしても Table "App\Model\Table\CardsTable" is not associated with "Auth" とでます。ちょっとこれは私に責任がありそうですね。もう一度、スレッド作り直したいと思います。 お二方とも大変ありがとうございました。
XYZA

2016/07/08 09:32

DebackKitが入っているとデフォルトで下のほうにケーキマークが出ると思います そこでセッションの確認ができるので見れるようであれば見てみるのもいいと思います
yajin

2016/07/08 09:56

sessionの内容はあってると思います。 現在 $user_id = $_SESSION["Auth"]["User"]["id"]; で取得してて問題ないのですが、コードが気持ち悪いので、質問しております。
guest

0

SQLとしては、

SQL

1select count(*) from posts where title = xxx and user_id = yyy

としたいのですよね?

だとすると、以下のようなコードになると思いますが、いかがでしょうか?

CakePHP

1$query = $this->posts->find() 2 ->where([ 3 'title' => $value, 4 'user_id' => $user_id 5 ]); 6 7$count = $query->count();

投稿2016/07/04 01:08

KatsumiTanaka

総合スコア924

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yajin

2016/07/04 06:24

はい。そういうことです。誠にありがとうございます。 ちなみにsessionIDからIDをひっぱってくる方法は $user_id = $_SESSION["Auth"]["User"]["id"]; $query = $table->find()->where(['title' => $value,'user_id' => $user_id]); な感じでよろしいでしょうか。メソッドチェーン的にはどのように記述すればよいのでしょうか。
KatsumiTanaka

2016/07/04 07:14

自分の考えでは、オブジェクト内のデータには、オブジェクトが用意するメソッドを使用してアクセスするべきだと思うので、 $user_id = $this->Session->read(”Auth.User.id"); という書き方が良いと思います
yajin

2016/07/04 08:25

返信ありがとうございます。現在試したところ、 $user_id = $this->Session->read("Auth.User.id"); に置き換えると、 Table "App\Model\Table\PostsTable" is not associated with "Session" と出てきます。 useの方に use Cake\ORM\Table; use Cake\Validation\Validator; use Cake\View\Helper\SessionHelper; use App\Controller\AppController; use Cake\Event\Event; use Cake\ORM\TableRegistry; を書いているのですが、どのようにsessionメソッドと結び付ければよいのでしょうか。
KatsumiTanaka

2016/07/04 08:31

すみません、CakePHP3.xからセッションオブジェクトへのアクセスが変更になったようです yajinさんが最初に書かれている $user_id = $this->request->session()->read('Auth.User.id'); で、問題ないと思います
yajin

2016/07/04 08:44

こちらこそ申し訳ございません。 $user_id = $this->request->session()->read('Auth.User.id'); にしたところ、今度は、 Table "App\Model\Table\PostsTable" is not associated with "request" と出てきました。なぜこのようになるのでしょうか。前提となるクラスのものをuseしなければならないのでしょうか。
KatsumiTanaka

2016/07/04 08:47

言葉が足りなかったようで申しわけありません これらのコードは、すべてコントローラーに記述するものと考えていますが、モデルのほうに記述しているのでしょうか?
yajin

2016/07/05 05:51

一応念のため両方に書いています。 自分でのデバッグはちょっと時間がかかっており、非常に重要な問題なので、引き続き継続していきたいと考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問