2024年2月8日木曜日

CakePHP でアソシエーションを含めたレコードの読込み

containを使え

あちこちのサイトを見ると、contain を使った方法がたくさん書いてありますね。
たとえば、products テーブルに取引先のIDである partner_id が含まれているとき
$product_id で示されるレコードを取得するには、次のように書きます。

  // コントローラの initialize() で
  $this->loadModel('Products');
  // レコードの取り込み処理で
  $record = $this->Products->get($product_id, ['contain' => ['Partners']]);

cakePHP を書きなれている人なら、同じみでしょう。
QueryBuilder を使った find() などでもアソシエーションとともに読み込みできますね。

  $record = $this->Products->find()
    contain(['Partners'])
    ->first();

どんだけ書くねん!

『こう書いておけば動く』から、なんでしょうか・・・
たぶん、世界中の人が、さまざまなプロダクトのテーブル参照を『とっても便利な』QueryBuilder を使って読み込んでいるのでしょうね。

おおきなプロダクトになってくると、それぞれのテーブルごとにレコード参照のコントローラ.phpファイルが増えて、手に負えなくなってしまいますねぇ

簡単にしちゃいましょう

レコードが _id で示されるインデックス指定のフィールドを持っているとき、contain でアソシエーションを『含めずに』読み込む、なんてことは逆に少ないはずです。
少なくとも、私の担当するプロダクトではレコード読込でアソシエーション不要、なんてことは皆無に近いですね。
そこで、こんなコードを共通コンポーネントに書き加えました。

/**
 * 指定テーブルのアソシエーション(BelongsTo/BelongsToMany)を含めて
 * レコードを取得する
 */
function LoadRecordWithBelongs($table, $id)
{
  $record = false;
  $contains = [];
  $associations = $table->associations();
  $items = $associations->getByType(['BelongsTo', 'BelongsToMany']);
  foreach($items as $item)
  {
    $name = $item->getName();
    $contains[] = $name;
  }
  $record = $table->get($id, ['contain' => $contains]);
  return $record;
}
ようするに、belongsTo, belongsToMany のアソシエーション定義されているテーブルなら、そいつをまとめて読み込んでくれよ、というコードです。

まとめ

共通化することで、たくさんのソースを削除することができるようになりますが。
それは、これからやり始めようとしてるところです・・・w

めでたしめでたし。

2024年2月3日土曜日

Visual Studio Code でCentOS7のリモートデバッグができなくなった!

突然使えなくなった VS Code + Remote SSH

昨日まで、普通に使えていた VS Code と Hyper-V 上の CentOS 7.9 上でのリモート開発
今朝、突然、使えなくなりましたよ。
どうやってもつながらない!
今日は土曜日だから、月曜あたりは日本中でこの問題、世界中で騒がれるんじゃないでしょうかね・・・
ったく・・・

パスワード入力してログインしようとすると、エラーになって繋がりません。

glibcとlibstdc++のバージョンが古い?

OSの中身を見てみると、確かに古いようです。
で、それならバージョンアップしてやろうということで、やってみました。
バージョンアップでやってみたことは、次の通り。
・gcc のバージョンアップ 13.2.0 をインストール。2度失敗。長かった・・・
・ここで、libstdc++を入れ替えできました。
・次に glibc のバージョンをあげる件ですが、結論から言いますと失敗しました。
・python 3 のインストール
・yum が動かなくなるので yum 編集
・gmake が古いと怒られます。で、4.2あたりをインストールしようとすると、エラーで止まっちゃう!
と、いうことで、CentOS7 側での対応はできませんでした。
(6時間・・・返してくださいよ・・・(´;ω;`))

解決方法

要するに、Visual Studio Code のアップデートが原因なんですよ
January 2024 (version 1.86)
拡張機能の Remote SSH がアップデートされてました。
で、このアップデートを古いバージョンにして、CentOS 側の /home/ユーザー ディレクトリ上の .vscode-server ディレクトリを削除。
・・・問題は変わりませんでした。
納期すぎていて、とっても焦っているのに、丸一日潰れかかってます・・・どーしてくれるんだ!

対応策

VS Code のバージョンをダウングレードしてしまいます!
まず、現在の VS Code をアンインストールする前に、次を実行しておきます。
・VS Code の自動アップデートを停止しておく。(設定:update あたり)
・拡張機能の自動アップデートを停止しておき。
VS Code をアンインストール。
このページの Downloads ってとこから該当バージョンをダウンロード
インストールしましょう!
CentOS 側の /home/ユーザー ディレクトリ上の .vscode-server ディレクトリを削除もわすれずに。

動いた!

昨日まで使っていたワークスペースを開いてみると、無事パスワード入力後に編集できるようになりました。
めでたしめでたし。