目次
ディスカッションへの返信(解決策)
ホームページ バックエンド開発 PHPチュートリアル ZF テーブル モデル作成の問題、オンライン待機中

ZF テーブル モデル作成の問題、オンライン待機中

Jun 23, 2016 pm 02:16 PM

助けてください。ZF フレームワークでテーブル モデルを構築していますが、テーブルには 2 つの主キー (結合キー) があります。 ? ? ? ? ? ?

class IndentdetailModel extends Zend_Db_Table{	protected $_name="indentdetail";	protected $_primary="indentnumber";	
ログイン後にコピー

テーブル構造:

このようなテーブルに対応するテーブル モデルを作成するには、主に $_primary=? を使用します。 ?ここが分かりません


ディスカッションへの返信(解決策)

これも分かりません、もしかしたら配列を使えばいいのかもしれません(完全に個人的な推測です)

でも、当時私はこんなことをしました

私のテーブル自体には主キーがありません
しかし、テーブルモデルを作成するときに、テーブル内のフィールドを主キーとして指定し、それに基づいて検索するなど、いくつかのテーブルメソッドを呼び出しました。 find() メソッドでも問題なく使用できるようです

でも、これは本当に非科学的だと思います
たぶん、問題が発生する状況に遭遇していないからです

階下の解決策を待ちましょう...

ああ、libraryZendDbTableAbstract.php ファイルを確認しました

ソースコード


これはテーブルモデルの親クラスであるはずです

その中に $primary に関する関連コメントも見つかりました
コメントでこう言われています
うわー

これはおそらく
主キーが 1 つしかない場合は文字列で初期化してください
If 主キーが複数ある場合は配列初期化を使用してください

予想通りですね〜

あ、ソース確認しましたファイルのコード

libraryZendDbTableAbstract.php


これはテーブル モデルの親クラスであるはずです

その中に $primary の相関関係も見つかりました コメント
コメントには次のように書かれています
PHP コード


1
2
3 ?
4
5
6
7
8
9
protected $_primary = null;


これはおそらく
主キーが 1 つしかない場合は文字列で初期化する
主キーが複数ある場合は配列を使用する初期化

ご想像の通り〜

読みましたが、試してみましたか? 配列を使用しましたが、何か問題が発生しました。サーバーが間違っていました。
protected $_primary =array(' キーの組み合わせを使用しました。 1','キーの組み合わせ 2');

この方法は間違っていますか? 正しい場合はアドバイスをお願いします。

今天抽空试了一下你说的问题 得到了一些结论 在这分享给你

首先$_primary是表模型的成员变量,在构建表模型的时候肯定是要重构的,这一点没有问题.
这个变量可以是一个字符串,也可以是一个数组.到底是字符串还是数组,这取决于你的数据表是有一个主键还是有多个主键.
当数据表中只有一个主键时,就用字符串初始化$_primary.
当数据表中有多个字段作为主键时,就要用数组来初始化$_primary了,并且数组长度与主键个数是相同的.

我还是使用了find()方法做的测试.

由于$_primary有可能是字符串,也有可能是数组,对应的,在使用find方法时,参数列表也就有了多种形式.

我先说$_primary变量为字符串的情况,也就是数据表只有一个主键的情况.
在这种情况下,主键只有一个,使用find()方法可以查找数据表中的一行或多行.
当要查询一行的时候,就直接将字符串传入find函数.
当要查询多行的时候,你需要将待查询的字段写入一个数组,再将数组传入find()方法即可.

这两种情况都很好理解.下面说$_primary变量为数组的情况,也就是数据表有多个主键的情况.

在这种情况下,主键有多个,使用find()方法同样可以查找数据表中的一行或多行.
当要查询一行的时候,你需要向find()函数传入主键个数个参数.举个例子,比如你有两个主键,你就需要将这两个主键的待查询的值作为参数传给find()方法,并且顺序要和$_primary初始化时的数组顺序保持一致.
当要查询多行的时候,你需要向find()函数传入主键个数个数组.举个例子,比如你有两个主键,你就需要创造两个数组作为参数传给find(),第一个数组存第一个主键待查询的所有取值,第二个数组就存第二个主键待查询的所有取值.需要强调的是,这两个数组的长度肯定是相同的,也就是你试图查询到的行数(之所以说"试图",是因为有可能不存在),而数组的个数就是主键的个数.

为了方便你理解,我把我做的例子给你看看

我的student表结构:
其中sid和sname都设置为了主键,所以会出现两个'001'.

+-----+--------+-----+| sid | sname  | sex |+-----+--------+-----+| 001 | parker | 男  || 001 | 李雷   | 男  || 002 | 韩梅梅 | 女  || 003 | jim    | 男  |+-----+--------+-----+
ログイン後にコピー

protected $_primary = array('sid', 'sname');
ログイン後にコピー

在这种情况下如果要查询第一行,find函数这么写
$res = $studentModel->find('001', 'parker')->toArray();
ログイン後にコピー

如果要查询多行,比如第二第三行,find函数这么写
$res = $studentModel->find(array('001', '002'), array('李雷', '韩梅梅'));
ログイン後にコピー

第一个数组的'001'和第二个数组的'李雷'对应;
第一个数组的'002'和第二个数组的'韩梅梅'对应;
但是第一个数组对应的永远是'sid'字段
第二个数组对应的永远是'sname'字段
之所以这么对应 是因为$_primary的初始化时决定的

综上所述
$_primary的初始化有两种形式
要不然是字符串,要不然是数组.

对应的,find()方法的参数有四种形式
一个字符串(一个主键,查一行);
一个数组(一个主键,查多行);
多个字符串(多个主键,查一行);
多个数组(多个主键,查多行)

而且我推测,即使是其它一些要涉及到有关主键的数据库操作方法,想必也是这样的传参数的思路

最后我确实查询到了想要的结果.
不知道我这些结论能不能解决你的问题.

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

PHPロギング:PHPログ分析のベストプラクティス PHPロギング:PHPログ分析のベストプラクティス Mar 10, 2025 pm 02:32 PM

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

Laravelサービスプロバイダーを登録および使用する方法 Laravelサービスプロバイダーを登録および使用する方法 Mar 07, 2025 am 01:18 AM

Laravelのサービスコンテナとサービスプロバイダーは、そのアーキテクチャの基本です。 この記事では、サービスコンテナ、詳細サービスプロバイダーの作成、登録、および実用的な使用法を例で説明します。 Oveから始めます

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

See all articles