cakephp3 検索機能の実装

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,695

minehan

score 154

いつもお世話になっています。 タイトルの通りなのですが、
こちらのページを参考に検索機能を作っていたのですが、
該当レコードがない時の処理が書いてなくて困っています。下記にまとめましたのでどなたか聡明なエンジニア様お助けいただけたら幸いです。

前提・実現したいこと

cakephp3系を使用した人材管理システムを現在作成しています。
全テーブルに社員番号のカラム(number)が仕込んであり、検索ボックスからpostで投げた社員番号($find)テーブルのnumberカラムにあるか調べています。
こちら、もし該当の社員番号がない場合、ない旨を画面に表示したい所存であります。

該当のソースコード(view)

//検索ボックス
<?= $this->Form->create() ?>
 <fieldset>
 <?php
   echo $this->Form->input('find',[
    'label'=>[
      'text'=>'社員番号を入力'
    ],
    'required'=>'required'
    ]);
    echo $this->Form->button('送信');
 ?>
 </fieldset>
<?= $this->Form->end() ?>

//検索結果 
<table>
  <tbody>
    <?php foreach ($×××× as $××××): ?>
      <p>下記で登録されています</p>
      <tr>
        <td><a href="該当テーブルのリンク">テーブル名:<?= h($××××->number) ?></a></td>
      <?php endforeach; ?>
      <?php foreach ($○○○○ as $○○○○): ?>
        <td><a href="該当テーブルのリンク">テーブル名:<?= h($○○○○->number) ?></a></td>
      <?php endforeach; ?>
      <?php foreach ($△△△△ as $△△△△): ?>
        <td><a href="該当テーブルのリンク">テーブル名:<?= h($△△△△->number) ?></a></td>
      <?php endforeach; ?>
      <?php foreach ($□□□□ as $□□□□): ?>
        <td><a href="該当テーブルのリンク">テーブル名:<?= h($□□□□->number) ?></a></td>
      <?php endforeach; ?>
      </tr>
  </tbody>
</table>

該当のソースコード(controller)

//※検索ボックスがUsersページ置いているためUsersのコントローラーに記載しています。

<?php
namespace App\Controller;

use App\Controller\AppController;
//他のテーブルを使用
use Cake\ORM\TableRegistry;

/**
 * Users Controller
 *
 * @property \App\Model\Table\UsersTable $Users
 */
class UsersController extends AppController
{

    /**
     * Index method
     *
     * @return \Cake\Network\Response|null
     */

   public function initialize(){
     parent::initialize();
     //他のテーブルを使用
     $this->×××× = TableRegistry::get('××××');
     $this->○○○○ = TableRegistry::get('○○○○');
     $this->△△△△ = TableRegistry::get('△△△△');
     $this->□□□□ = TableRegistry::get('□□□□');
   }

    public function index()
    {

      //レイアウトの指定
      $this->viewBuilder()->layout('users');

      //検索 変数宣言 
      $×××× = [];
      $○○○○ = [];
      $△△△△ = [];
      $□□□□ = [];

      //検索 条件式
      if ($this->request->is('post')) {
        $find = $this->request->data['find'];
        $×××× = $this->××××->find()->where(["number" => $find ]);
        $○○○○ = $this->○○○○->find()->where(["number" => $find ]);
        $△△△△ = $this->△△△△->find()->where(["number" => $find ]);
        $□□□□ = $this->□□□□->find()->where(["number" => $find ]);
      }

      //検索 結果のセット
      $this->set('××××', $××××);
      $this->set('○○○○', $○○○○);
      $this->set('△△△△', $△△△△);
      $this->set('□□□□', $□□□□);

    }
//〜以下略〜

現在の状況

該当の検索結果があると表示されます。
該当の検索結果がない場合は何も起きません。

補足 table

テーブルの1つです。もちろん内容はダミーです
テーブルの1つです

補足

var_dumpで変数$××××を調べたら他のレコードも入っているみたいでした。
var_dump内容

また補足があれば書きますので宜しくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

<?php if (count($××××) > 0): ?>
<table>
  <tbody>
    <?php foreach ($×××× as $××××): ?>
      <p>下記で登録されています</p>
      <tr>
        <td><a href="該当テーブルのリンク">テーブル名:<?= h($××××->number) ?></a></td>
      <?php endforeach; ?>
      <?php foreach ($○○○○ as $○○○○): ?>
        <td><a href="該当テーブルのリンク">テーブル名:<?= h($○○○○->number) ?></a></td>
      <?php endforeach; ?>
      <?php foreach ($△△△△ as $△△△△): ?>
        <td><a href="該当テーブルのリンク">テーブル名:<?= h($△△△△->number) ?></a></td>
      <?php endforeach; ?>
      <?php foreach ($□□□□ as $□□□□): ?>
        <td><a href="該当テーブルのリンク">テーブル名:<?= h($□□□□->number) ?></a></td>
      <?php endforeach; ?>
      </tr>
    <?php endforeach; ?> // これ抜けてる
  </tbody>
</table>
<?php else: ?>
    <p>no recoredset</p>
<?php endif; ?>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/31 04:34

    ご返答ありがとうございます。

    <?php if count($××××) > 0: ?>

    構文エラーでしたので直しました。 
    <?php if (count($××××) > 0): ?>

    <?php endforeach; ?> // これ抜けてる

    Error: syntax error, unexpected 'endforeach' (T_ENDFOREACH)
    すいませんプログラミング初心者なのでよく分からないのですがこちらforeachの数に対してendforeachの数が多いのが原因だと思ったのですが違いますでしょうか?

    <?php else: ?>
    <p>no recoredset</p>
    <?php endif; ?>

    検索走らせる前から表示されてしまっています。
    また検索結果がture時なら消えます。
    検索結果がfalseなら消えて何も表示されません。

    キャンセル

  • 2016/07/31 04:37

    <?php if (count($××××) > 0): ?>
    閉じかっこ足りてません。

    キャンセル

0

回答ありがとうございました。
controller側で、

$カウント用の変数 = $this->××××->find()->where(["number" => $find ])->count();


view側で

<?php
      if($カウント用変数 == 0){
        echo "<p>データがありません</p>";
      }
?>


上記で解決できました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる