{"id":1109,"date":"2025-06-12T13:07:37","date_gmt":"2025-06-12T05:07:37","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1109.html"},"modified":"2025-06-12T13:07:37","modified_gmt":"2025-06-12T05:07:37","slug":"php-doctrine-%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e6%9e%9a%e4%b8%be%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1109.html","title":{"rendered":"PHP Doctrine: \u5982\u4f55\u4f7f\u7528\u679a\u4e3e\u6570\u636e\u7c7b\u578b"},"content":{"rendered":"<div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--1\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/dyA-1-400x300.jpg\" alt=\"Bug&#32534;&#35793;&#29422;\" class=\"wp-image-1842\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">Bug&#32534;&#35793;&#29422;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#12298;PHP Doctrine&#65306;&#22914;&#20309;&#20351;&#29992;&#26522;&#20030;&#25968;&#25454;&#31867;&#22411;&#12299;<\/p>\n<p>&#22312;&#29616;&#20195;&#30340;Web&#24320;&#21457;&#20013;&#65292;&#25968;&#25454;&#24211;&#26159;&#23384;&#20648;&#21644;&#31649;&#29702;&#25968;&#25454;&#30340;&#20851;&#38190;&#24037;&#20855;&#12290;PHP Doctrine&#26159;&#19968;&#20010;&#24378;&#22823;&#30340;&#26694;&#26550;&#65292;&#29992;&#20110;&#19982;&#21508;&#31181;&#25968;&#25454;&#24211;&#36827;&#34892;&#20132;&#20114;&#12290;&#26522;&#20030;&#65288;Enum&#65289;&#26159;&#19968;&#31181;&#29305;&#27530;&#30340;&#25968;&#25454;&#31867;&#22411;&#65292;&#23427;&#20801;&#35768;&#20320;&#22312;&#25968;&#25454;&#24211;&#20013;&#23450;&#20041;&#19968;&#32452;&#24120;&#37327;&#65292;&#24182;&#19988;&#21487;&#20197;&#22312;&#24212;&#29992;&#31243;&#24207;&#20013;&#20351;&#29992;&#36825;&#20123;&#24120;&#37327;&#26469;&#34920;&#31034;&#29366;&#24577;&#25110;&#36873;&#39033;&#12290;<\/p>\n<p>&#20197;&#19979;&#26159;&#22914;&#20309;&#20351;&#29992;Doctrine&#26469;&#21019;&#24314;&#21644;&#25805;&#20316;&#26522;&#20030;&#25968;&#25454;&#31867;&#22411;&#30340;&#27493;&#39588;&#65306;<\/p>\n<h3>1. &#23433;&#35013;Doctrine<\/h3>\n<p>&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#23433;&#35013;Doctrine&#12290;&#20320;&#21487;&#20197;&#36890;&#36807;Composer&#26469;&#23433;&#35013;&#65306;<\/p>\n<pre><code class=\"language-bash\">composer require doctrine\/orm<\/code><\/pre>\n<h3>2. &#37197;&#32622;&#25968;&#25454;&#24211;&#36830;&#25509;<\/h3>\n<p>&#22312;&#20320;&#30340;<code>config\/packages\/doctrine.yaml<\/code>&#25991;&#20214;&#20013;&#37197;&#32622;&#25968;&#25454;&#24211;&#36830;&#25509;&#65306;<\/p>\n<pre><code class=\"language-yaml\">doctrine:\n    dbal:\n        default_connection: default\n        connections:\n            default:\n                driver: pdo_mysql\n                host: localhost\n                port: 3306\n                dbname: your_database_name\n                user: your_username\n                password: your_password\n                charset: utf8mb4\n                collate: utf8mb4_unicode_ci\n                url: '%env(resolve:DATABASE_URL)%'\n    orm:\n        auto_generate_proxy_classes: true\n        naming_strategy: doctrine.orm.naming_strategy.underscorenaming\n        mappings:\n            AppEntity:\n                type: annotation\n                dir: '%kernel.project_dir%\/src\/Entity'\n                prefix: 'App\\Entity\\'\n                is_bundle: false<\/code><\/pre>\n<h3>3. &#21019;&#24314;&#23454;&#20307;&#31867;<\/h3>\n<p>&#21019;&#24314;&#19968;&#20010;&#23454;&#20307;&#31867;&#65292;&#20854;&#20013;&#21253;&#21547;&#26522;&#20030;&#23383;&#27573;&#12290;&#20363;&#22914;&#65292;&#25105;&#20204;&#21019;&#24314;&#19968;&#20010;&#21517;&#20026;<code>ProductStatus<\/code>&#30340;&#26522;&#20030;&#31867;&#65292;&#24182;&#23558;&#20854;&#24212;&#29992;&#21040;&#19968;&#20010;&#23454;&#20307;&#31867;&#20013;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppEntity;\n\nuse DoctrineORMMapping as ORM;\nuse SymfonyComponentSerializerAnnotationSerializedName;\n\n\/**\n * @ORMEntity(repositoryClass=\"AppRepositoryProductStatusRepository\")\n *\/\nclass ProductStatus\n{\n    \/**\n     * @ORMId()\n     * @ORMGeneratedValue(strategy=\"AUTO\")\n     * @ORMColumn(type=\"integer\")\n     *\/\n    private $id;\n\n    \/**\n     * @ORMColumn(type=\"string\", length=50)\n     *\n     * @SerializedName(\"status\")\n     *\/\n    private $status;\n\n    \/\/ Getters and Setters\n}<\/code><\/pre>\n<h3>4. &#27880;&#20876;&#26144;&#23556;<\/h3>\n<p>&#30830;&#20445;&#20320;&#30340;&#23454;&#20307;&#31867;&#34987;&#27491;&#30830;&#27880;&#20876;&#20026;Doctrine&#30340;&#26144;&#23556;&#12290;&#36890;&#24120;&#24773;&#20917;&#19979;&#65292;&#36825;&#24050;&#32463;&#21253;&#21547;&#20102;&#12290;<\/p>\n<h3>5. &#20351;&#29992;&#26522;&#20030;&#20540;<\/h3>\n<p>&#22312;&#24212;&#29992;&#31243;&#24207;&#20013;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992;&#26522;&#20030;&#20540;&#26469;&#34920;&#31034;&#20135;&#21697;&#29366;&#24577;&#12290;&#20363;&#22914;&#65292;&#20320;&#21487;&#20197;&#36825;&#26679;&#26597;&#35810;&#24182;&#26174;&#31034;&#20135;&#21697;&#29366;&#24577;&#65306;<\/p>\n<pre><code class=\"language-php\">use AppEntityProductStatus;\n\n\/\/ &#33719;&#21462;&#25152;&#26377;&#20135;&#21697;&#29366;&#24577;\n$productStatuses = $entityManager-&gt;getRepository(ProductStatus::class)-&gt;findAll();\n\nforeach ($productStatuses as $status) {\n    echo \"ID: {$status-&gt;getId()}, Status: {$status-&gt;getStatus()}n\";\n}<\/code><\/pre>\n<h3>&#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#20197;&#19979;&#26159;&#19968;&#20010;&#23436;&#25972;&#30340;&#31034;&#20363;&#20195;&#30721;&#65292;&#23637;&#31034;&#20102;&#22914;&#20309;&#20351;&#29992;Doctrine&#26469;&#21019;&#24314;&#12289;&#26597;&#35810;&#21644;&#25805;&#20316;&#26522;&#20030;&#25968;&#25454;&#31867;&#22411;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nrequire_once 'vendor\/autoload.php';\n\nuse DoctrineORMEntityManagerFactory;\nuse DoctrineORMEntityManagerInterface;\nuse DoctrineORMToolsSetup;\nuse AppEntityProductStatus;\n\n$paths = ['src\/Entity'];\n\n$config = Setup::createAnnotationMetadataConfiguration($paths, true);\n\n$factory = EntityManagerFactory::create(['default' =&gt; ['driver' =&gt; 'pdo_mysql', 'host' =&gt; 'localhost', 'dbname' =&gt; 'your_database_name', 'user' =&gt; 'your_username', 'password' =&gt; 'your_password']], true);\n$entityManager = $factory-&gt;createEntityManager();\n\n\/\/ &#28155;&#21152;&#20135;&#21697;&#29366;&#24577;\n$status1 = new ProductStatus();\n$status1-&gt;setStatus('active');\n$entityManager-&gt;persist($status1);\n$entityManager-&gt;flush();\n\n$status2 = new ProductStatus();\n$status2-&gt;setStatus('inactive');\n$entityManager-&gt;persist($status2);\n$entityManager-&gt;flush();\n\n\/\/ &#26597;&#35810;&#25152;&#26377;&#20135;&#21697;&#29366;&#24577;\n$productStatuses = $entityManager-&gt;getRepository(ProductStatus::class)-&gt;findAll();\n\nforeach ($productStatuses as $status) {\n    echo \"ID: {$status-&gt;getId()}, Status: {$status-&gt;getStatus()}n\";\n}\n\n\/\/ &#20851;&#38381;EntityManager\n$entityManager-&gt;close();\n$factory-&gt;close();\n?&gt;<\/code><\/pre>\n<p>&#36890;&#36807;&#20197;&#19978;&#27493;&#39588;&#65292;&#20320;&#21487;&#20197;&#22312;PHP Doctrine&#20013;&#25104;&#21151;&#22320;&#20351;&#29992;&#26522;&#20030;&#25968;&#25454;&#31867;&#22411;&#26469;&#31649;&#29702;&#21644;&#25805;&#20316;&#25968;&#25454;&#24211;&#20013;&#30340;&#25968;&#25454;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--2\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/zp-400x300.jpg\" alt=\"&#40657;&#26495;Bug&#35762;&#24072;\" class=\"wp-image-1849\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#40657;&#26495;Bug&#35762;&#24072;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<body><h2>&#20171;&#32461;<\/h2><p>&#24403;&#35848;&#21040;&#25968;&#25454;&#24211;&#31649;&#29702;&#26102;&#65292;&#19981;&#20165;SQL&#24456;&#37325;&#35201;&#65292;&#22914;&#20309;&#32467;&#26500;&#21644;&#22788;&#29702;&#25968;&#25454;&#20063;&#33021;&#24110;&#21161;&#26377;&#25928;&#24314;&#27169;&#24182;&#26597;&#35810;&#25968;&#25454;&#12290;&#19968;&#20010;&#37325;&#35201;&#30340;&#26041;&#38754;&#26159;&#22914;&#20309;&#20351;&#29992;&#36866;&#24403;&#30340;&#25968;&#25454;&#31867;&#22411;&#26469;&#19982;&#20320;&#30340;&#25968;&#25454;&#27169;&#22411;&#30456;&#21305;&#37197;&#12290;&#22312;&#26412;&#25945;&#31243;&#20013;&#65292;&#25105;&#20204;&#23558;&#25506;&#35752;PHP Doctrine ORM&#65288;&#23545;&#35937;&#20851;&#31995;&#26144;&#23556;&#22120;&#65289;&#20013;&#30340;&#26522;&#20030;&#25968;&#25454;&#31867;&#22411;&#30340;&#24212;&#29992;&#12290;<\/p><p>&#26522;&#20030;&#65288;enum&#65289;&#26159;&#19968;&#31181;&#25968;&#25454;&#31867;&#22411;&#65292;&#23427;&#30001;&#19968;&#32452;&#21629;&#21517;&#30340;&#20540;&#32452;&#25104;&#12290;&#36825;&#20123;&#36890;&#24120;&#29992;&#20110;&#34920;&#31034;&#19968;&#20010;&#26377;&#38480;&#30340;&#29366;&#24577;&#38598;&#25110;&#21464;&#20307;&#65292;&#22914;&#29366;&#24577;&#30721;&#12289;&#31867;&#21035;&#12289;&#24037;&#20316;&#26085;&#31561;&#12290;&#19982;&#20854;&#23427;&#25968;&#25454;&#31867;&#22411;&#19981;&#21516;&#30340;&#26159;&#65292;&#26522;&#20030;&#38480;&#21046;&#20102;&#20854;&#20540;&#21482;&#33021;&#22312;&#23450;&#20041;&#30340;&#24120;&#37327;&#38598;&#20013;&#36873;&#25321;&#65292;&#20174;&#32780;&#30830;&#20445;&#24744;&#24635;&#26159;&#26377;&#19968;&#20010;&#26377;&#25928;&#30340;&#39044;&#26399;&#20540;&#12290;<\/p><h2>&#22312;Doctrine&#20013;&#29702;&#35299;&#26522;&#20030;&#31867;&#22411;&#65288;Enums&#65289;&#26159;&#38750;&#24120;&#37325;&#35201;&#30340;&#65292;&#23427;&#20204;&#21487;&#20197;&#25552;&#20379;&#19968;&#31181;&#26356;&#28165;&#26224;&#12289;&#26356;&#20855;&#21487;&#35835;&#24615;&#30340;&#25968;&#25454;&#23384;&#20648;&#26041;&#24335;&#12290;&#20197;&#19979;&#26159;&#19968;&#20123;&#20851;&#20110;&#22914;&#20309;&#22312;Doctrine&#20013;&#20351;&#29992;&#26522;&#20030;&#31867;&#22411;&#30340;&#35201;&#28857;&#65306;\n\n&#23450;&#20041;&#26522;&#20030;&#31867;&#22411;&#65306;\n&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#21019;&#24314;&#19968;&#20010;&#26522;&#20030;&#31867;&#12290;&#20363;&#22914;&#65292;&#22914;&#26524;&#20320;&#26377;&#19968;&#20010;&#34920;&#31034;&#24615;&#21035;&#65288;&#30007;\/&#22899;&#65289;&#30340;&#26522;&#20030;&#65292;&#20320;&#21487;&#20197;&#36825;&#26679;&#23450;&#20041;&#23427;&#65306;\n\/\/ src\/AppBundle\/Entity\/Gender.php\n\nnamespace AppBundleEntity;\n\nenum Gender {\n MALE,\n FEMALE\n}\n\n&#20851;&#32852;&#21040;&#25968;&#25454;&#24211;&#34920;&#65306;\n&#22312;&#37197;&#32622;&#25991;&#20214;&#65288;&#36890;&#24120;&#26159;doctrine.yaml&#25110;config\/packages\/doctrine.yaml&#65289;&#20013;&#65292;&#20320;&#38656;&#35201;&#20026;&#36825;&#20010;&#26522;&#20030;&#31867;&#22411;&#25351;&#23450;&#19968;&#20010;&#23545;&#24212;&#30340;&#25968;&#25454;&#24211;&#23383;&#27573;&#12290;&#20363;&#22914;&#65292;&#22914;&#26524;&#24615;&#21035;&#20449;&#24687;&#23384;&#25918;&#22312;&#21517;&#20026;gender&#30340;&#21015;&#20013;&#65292;&#20320;&#21487;&#20197;&#36825;&#26679;&#37197;&#32622;&#65306;\n# config\/packages\/doctrine.yaml\n\ndoctrine:\n dbal:\n types:\n gender: string\n\n&#26144;&#23556;&#23454;&#20307;&#31867;&#65306;\n&#29616;&#22312;&#65292;&#24403;&#20320;&#23450;&#20041;&#20102;&#23454;&#20307;&#31867;&#24182;&#25351;&#23450;&#20102;&#19982;&#25968;&#25454;&#24211;&#34920;&#30456;&#20851;&#32852;&#30340;&#23646;&#24615;&#26102;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992;&#36825;&#20123;&#26522;&#20030;&#20540;&#12290;&#20363;&#22914;&#65292;&#20551;&#35774;&#25105;&#20204;&#26377;&#20197;&#19979;&#23454;&#20307;&#31867;&#65306;\n\/\/ src\/AppBundle\/Entity\/User.php\n\nnamespaceAppBundleEntity;\n\nuse DoctrineORMMapping as ORM;\nuse SymfonyComponentValidatorConstraints as Assert;\n\n\/**\n* @ORMEntity(repositoryClass=&#8221;AppBundleRepositoryUserRepository&#8221;)\n*\/\nclass User\n{\n \/**\n * @ORMId()\n * @ORMGeneratedValue()\n * @ORMColumn(type=&#8221;integer&#8221;)\n *\/\n private $id;\n\n \/**\n * @ORMColumn(type=&#8221;string&#8221;, length=255)\n *\/\n private $username;\n\n \/**\n * @ORMColumn(type=&#8221;enum&#8221;, options={&#8220;length&#8221;: 64})\n *\/\n private $gender = Gender::MALE; \/\/ &#40664;&#35748;&#20540;&#35774;&#32622;&#20026;MALE\n\n public function getId(): ?int\n {\n return $this-&gt;id;\n }\n\n public function getUsername(): ?string\n {\n return $this-&gt;username;\n }\n\n public function setUsername(string $username): self\n {\n $this-&gt;username = $username;\n\n return $this;\n }\n\n public function getGender(): ?Gender\n {\n return $this-&gt;gender;\n }\n\n public function setGender(Gender $gender): self\n {\n $this-&gt;gender = $gender;\n\n return $this;\n }\n}\n\n&#39564;&#35777;&#21644;&#36716;&#25442;&#65306;\nDoctrine&#20250;&#33258;&#21160;&#22788;&#29702;&#23558;&#26522;&#20030;&#20540;&#36716;&#25442;&#20026;&#25968;&#25454;&#24211;&#20013;&#30340;&#23383;&#31526;&#20018;&#20197;&#21450;&#20174;&#25968;&#25454;&#24211;&#20013;&#25552;&#21462;&#36825;&#20123;&#20540;&#12290;&#27492;&#22806;&#65292;&#20320;&#36824;&#21487;&#20197;&#36890;&#36807;&#28155;&#21152;&#39564;&#35777;&#35268;&#21017;&#26469;&#30830;&#20445;&#29992;&#25143;&#36755;&#20837;&#31526;&#21512;&#39044;&#26399;&#30340;&#26522;&#20030;&#20540;&#12290;\n\n&#23433;&#20840;&#24615;&#32771;&#34385;&#65306;\n&#27880;&#24847;&#65292;&#26522;&#20030;&#31867;&#22411;&#30340;&#40664;&#35748;&#20540;&#65288;&#22914;&#19978;&#38754;&#31034;&#20363;&#20013;&#30340;Gender::MALE&#65289;&#36890;&#24120;&#20250;&#34987;&#35270;&#20026;&#24120;&#37327;&#12290;&#36825;&#24847;&#21619;&#30528;&#22914;&#26524;&#23581;&#35797;&#26356;&#25913;&#35813;&#20540;&#65292;&#21487;&#33021;&#20250;&#24341;&#21457;&#38169;&#35823;&#12290;&#20026;&#20102;&#38450;&#27490;&#36825;&#31181;&#24773;&#20917;&#65292;&#20320;&#24212;&#35813;&#22312;&#23454;&#38469;&#24212;&#29992;&#20013;&#23545;&#29992;&#25143;&#30340;&#36755;&#20837;&#36827;&#34892;&#36866;&#24403;&#30340;&#39564;&#35777;&#21644;&#39044;&#22788;&#29702;&#12290;\n\n&#36890;&#36807;&#36981;&#24490;&#19978;&#36848;&#27493;&#39588;&#65292;&#20320;&#21487;&#20197;&#22312;Doctrine&#20013;&#26377;&#25928;&#22320;&#20351;&#29992;&#26522;&#20030;&#31867;&#22411;&#26469;&#31649;&#29702;&#22797;&#26434;&#30340;&#25968;&#25454;&#32467;&#26500;&#12290;<\/h2><p>Doctrine&#19981;&#25903;&#25345;&#21407;&#29983;&#26522;&#20030;&#31867;&#22411;&#12290;&#36825;&#26159;&#22240;&#20026;&#26522;&#20030;&#22312;&#25152;&#26377;&#25968;&#25454;&#24211;&#24179;&#21488;&#19978;&#30340;&#26631;&#20934;&#24182;&#19981;&#32479;&#19968;&#12290;&#28982;&#32780;&#65292;&#20320;&#21487;&#20197;&#36890;&#36807;&#33258;&#23450;&#20041;&#25968;&#25454;&#31867;&#22411;&#25110;&#20351;&#29992;Doctrine&#25193;&#23637;&#26469;&#26144;&#23556;&#26522;&#20030;&#12290;<\/p><h3>&#23558;&#26522;&#20030;&#23450;&#20041;&#20026;&#33258;&#23450;&#20041;&#25968;&#25454;&#31867;&#22411;<\/h3><p>&#22312;Doctrine&#20013;&#21019;&#24314;&#26522;&#20030;&#31867;&#22411;&#65292;&#20320;&#38656;&#35201;&#23450;&#20041;&#19968;&#20010;&#33258;&#23450;&#20041;&#30340;&#25968;&#25454;&#31867;&#22411;&#31867;&#12290;&#20197;&#19979;&#26159;&#23454;&#29616;&#27492;&#21151;&#33021;&#30340;&#27493;&#39588;&#25351;&#21335;&#65306;<\/p><p>&#27880;&#20876;&#33258;&#23450;&#20041;&#31867;&#22411;&#20197;&#19982;Doctrine&#20851;&#32852;&#65292;&#24182;&#23558;&#20854;&#26144;&#23556;&#21040;&#23454;&#20307;&#30340;&#23646;&#24615;&#19978;&#12290;<\/p><p>&#23454;&#29616;&#20197;&#19979;&#26041;&#27861;&#65306;<code>convertToPHPValue<\/code>&#22909;&#30340;&#65292;&#35831;&#21457;&#36865;&#20320;&#38656;&#35201;&#32763;&#35793;&#30340;&#20869;&#23481;&#12290;<code>convertToDatabaseValue<\/code>&#21644;&#20320;&#26377;&#20160;&#20040;&#38382;&#39064;&#21602;&#65311;<code>getSQLDeclaration<\/code>&#24050;&#32463;&#25910;&#21040;&#20449;&#24687;&#12290;<\/p><p>&#35831;&#25552;&#20379;&#26356;&#22810;&#20449;&#24687;&#65292;&#20197;&#20415;&#25105;&#33021;&#22815;&#24110;&#21161;&#24744;&#12290;<code>DoctrineDBALTypesType<\/code>&#23545;&#19981;&#36215;&#65292;&#25105;&#26080;&#27861;&#29702;&#35299;&#24744;&#30340;&#38382;&#39064;&#12290;&#22914;&#26524;&#24744;&#26377;&#20854;&#20182;&#38656;&#35201;&#24110;&#21161;&#30340;&#20869;&#23481;&#65292;&#35831;&#21578;&#35785;&#25105;&#12290;<\/p><p>&#20197;&#19979;&#26159;&#20351;&#29992;&#29366;&#24577;&#26522;&#20030;&#30340;&#31616;&#21333;&#31034;&#20363;&#65306;<\/p><pre><code>namespace AppDbTypes;\n\nuse DoctrineDBALPlatformsAbstractPlatform;\nuse DoctrineDBALTypesType;\n\nclass StatusType extends Type\n{\n    const STATUS_NEW = 'new';\n    const STATUS_PENDING = 'pending';\n    const STATUS_DONE = 'done';\n\n    \/\/ Define the enum type name\n    public function getName()\n    {\n        return 'enumstatus';\n    }\n\n    \/\/ Define the SQL declaration\n    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)\n    {\n        return \"ENUM('new', 'pending', 'done')\";\n    }\n\n    \/\/ Convert database value to PHP Enum value\n    public function convertToPHPValue($value, AbstractPlatform $platform)\n    {\n        switch ($value) {\n            case self::STATUS_NEW:\n                return self::STATUS_NEW;\n            case self::STATUS_PENDING:\n                return self::STATUS_PENDING;\n            case self::STATUS_DONE:\n                return self::STATUS_DONE;\n            default:\n                throw new InvalidArgumentException(\"Unexpected status value\");\n        }\n    }\n\n    \/\/ Convert PHP Enum value to database value\n    public function convertToDatabaseValue($value, AbstractPlatform $platform)\n    {\n        if (!in_array($value, [self::STATUS_NEW, self::STATUS_PENDING, self::STATUS_DONE])) {\n            throw new InvalidArgumentException(\"Invalid status\");\n        }\n        return $value;\n    }\n}\n<\/code><\/pre><p>&#36825;&#20010;&#31867;&#22768;&#26126;&#20102;&#19968;&#20010;&#33258;&#23450;&#20041;&#31867;&#22411;&ldquo;enumstatus&rdquo;&#12290;&#24403;&#20320;&#20351;&#29992;&#36825;&#20010;&#33258;&#23450;&#20041;&#31867;&#22411;&#26469;&#23450;&#20041;&#19968;&#20010;&#23383;&#27573;&#26102;&#65292;&#23558;&#20250;&#20986;&#29616;&#38169;&#35823;&#12290;<code>getSQLDeclaration<\/code>&#26041;&#27861;&#36820;&#22238;&#21019;&#24314;&#26522;&#20030;&#21015;&#25152;&#38656;&#30340;&#29305;&#23450;SQL&#12290;<\/p><h3>&#23558;&#26522;&#20030;&#31867;&#22411;&#26144;&#23556;&#21040;&#23454;&#20307;<\/h3><p>&#21019;&#24314;&#33258;&#23450;&#20041;&#31867;&#22411;&#21518;&#65292;&#38656;&#35201;&#22312;&#23454;&#20307;&#30340;&#26144;&#23556;&#20013;&#36827;&#34892;&#22768;&#26126;&#65306;<\/p><pre><code>\/**\n * @Entity\n * @Table(name=\"tasks\")\n *\/\n\nclass Task\n{\n    \/**\n     * @Column(type=\"enumstatus\")\n     *\/\n    protected $status;\n\n    \/\/ getter and setter methods\n}\n<\/code><\/pre><p>&#22312;&#20351;&#29992;&#25105;&#20204;&#30340;&#33258;&#23450;&#20041;&#31867;&#22411;&#20043;&#21069;&#65292;&#24517;&#39035;&#20808;&#23558;&#20854;&#27880;&#20876;&#21040;Doctrine&#65306;<\/p><pre><code>use AppDbTypesStatusType;\n\nType::addType('enumstatus', StatusType::class);\n$entityManager-&gt;getConnection()-&gt;getDatabasePlatform()-&gt;registerDoctrineTypeMapping('enumstatus', 'enumstatus');<\/code><\/pre><p>&#19968;&#26086;&#27880;&#20876;&#65292;Doctrine &#23558;&#20351;&#29992;&#25105;&#20204;&#30340;&#33258;&#23450;&#20041;&#23454;&#29616;&#26469;&#22788;&#29702;&#19982;&#20043;&#20132;&#20114;&#12290;<code>status<\/code>&#22312;&#30000;&#22320;&#37324;&#12290;<code>Task<\/code>&#23454;&#20307;&#12290;<\/p><h2>&#20351;&#29992;Doctrine&#25193;&#23637;&#26469;&#22788;&#29702;&#26522;&#20030;&#31867;&#22411;<\/h2><p>&#21478;&#19968;&#31181;&#26041;&#27861;&#26159;&#20351;&#29992;&#31532;&#19977;&#26041;&#24211;&#65292;&#20363;&#22914;Doctrine Extensions&#21253;&#12290;&#36825;&#20010;&#24211;&#25552;&#20379;&#20102;Doctrine 2&#34892;&#20026;&#25193;&#23637;&#30340;&#19968;&#37096;&#20998;&#65292;&#20854;&#20013;&#21253;&#21547;MySQL&#30340;ENUM&#31867;&#22411;&#30340;&#25903;&#25345;&#12290;&#36825;&#37324;&#21482;&#38656;&#20351;&#29992;&#25552;&#20379;&#30340;&#26522;&#20030;&#31867;&#22411;&#65292;&#32780;&#19981;&#26159;&#33258;&#24049;&#32534;&#20889;&#12290;<\/p><h2>&#25805;&#32437;&#26522;&#20030;&#20540;<\/h2><p>&#19982;&#23454;&#20307;&#20013;&#30340;&#26522;&#20030;&#30456;&#20851;&#24037;&#20316;&#38750;&#24120;&#31616;&#21333;&#12290;&#24744;&#23558;&#20197;&#31867;&#20284;&#30340;&#26041;&#24335;&#19982;&#20854;&#20182;&#23383;&#27573;&#20132;&#20114;&#65306;<\/p><pre><code>$task = new Task();\n$task-&gt;setStatus(Task::STATUS_NEW);\n$entityManager-&gt;persist($task);\n$entityManager-&gt;flush();<\/code><\/pre><p>&#33719;&#21462;&#20540;&#20165;&#20165;&#38656;&#35201;&#20351;&#29992;&#36866;&#24403;&#30340;getter&#26041;&#27861;&#21363;&#21487;&#65306;<\/p><pre><code>$status = $task-&gt;getStatus();\n<\/code><\/pre><p>&#27492;&#22806;&#65292;&#21487;&#20197;&#28155;&#21152;&#39564;&#35777;&#20197;&#30830;&#20445;&#35774;&#32622;&#21644;&#26816;&#32034;&#30340;&#20540;&#26469;&#33258;&#39044;&#23450;&#20041;&#26522;&#20030;&#27744;&#12290;<\/p><h2>&#32467;&#35770;&#12290;<\/h2><p>&#22312;&#26412;&#25945;&#31243;&#20013;&#65292;&#25105;&#20204;&#24050;&#32463;&#20171;&#32461;&#20102;&#22914;&#20309;&#20351;&#29992;PHP Doctrine&#20013;&#30340;&#26522;&#20030;&#25968;&#25454;&#31867;&#22411;&#12290;&#34429;&#28982;Doctrine&#19981;&#25903;&#25345;&#26522;&#20030;&#31867;&#22411;&#65292;&#22240;&#20026;&#23427;&#26088;&#22312;&#25968;&#25454;&#24211;&#26080;&#20851;&#65292;&#20294;&#21487;&#20197;&#36890;&#36807;&#20197;&#19979;&#26041;&#27861;&#32469;&#36807;&#23427;&#65306;&#24744;&#21487;&#20197;&#23450;&#20041;&#33258;&#24049;&#30340;&#33258;&#23450;&#20041;&#25968;&#25454;&#31867;&#22411;&#25110;&#20351;&#29992;&#31532;&#19977;&#26041;&#24211;&#26469;&#31649;&#29702;&#24744;&#30340;&#26522;&#20030;&#12290;&#35831;&#27880;&#24847;&#65292;&#20351;&#29992;&#26522;&#20030;&#21487;&#33021;&#20250;&#26377;&#20197;&#19979;&#38382;&#39064;&#65306;&#19981;&#21516;&#25968;&#25454;&#24211;&#20043;&#38388;&#30340;&#21487;&#31227;&#26893;&#24615;&#38382;&#39064;&#20197;&#21450;&#19968;&#26086;&#20351;&#29992;&#20102;&#26522;&#20030;&#20540;&#65292;&#22312;&#20351;&#29992;&#36807;&#31243;&#20013;&#21487;&#33021;&#24456;&#38590;&#36827;&#34892;&#26356;&#25913;&#12290;&#22312;&#20915;&#23450;&#26159;&#21542;&#22312;&#25968;&#25454;&#24211;&#31574;&#30053;&#20013;&#23454;&#26045;&#26522;&#20030;&#20043;&#21069;&#65292;&#35831;&#20180;&#32454;&#32771;&#34385;&#24744;&#30340;&#29992;&#20363;&#12290;<\/p><p>&#24076;&#26395;&#36825;&#20010;&#25945;&#31243;&#24050;&#32463;&#20026;&#20320;&#25552;&#20379;&#20102;&#20351;&#29992;PHP Doctrine&#30340;&#26522;&#20030;&#26377;&#25928;&#20351;&#29992;&#30340;&#35265;&#35299;&#12290;&#31069;&#20320;&#22909;&#36816;&#65281;<\/p><\/body>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--3\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/xygcfznnzczhsdmwydzhsmzzzmddnq-400x300.jpg\" alt=\"&#38271;&#24037;&#30721;&#22900;1523\" class=\"wp-image-2906\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#38271;&#24037;&#30721;&#22900;1523<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#22312; PHP &#20013;&#65292;&#26522;&#20030;&#65288;Enum&#65289;&#26159;&#19968;&#31181;&#29305;&#27530;&#30340;&#31867;&#65292;&#23427;&#21487;&#20197;&#29992;&#26469;&#34920;&#31034;&#19968;&#32452;&#39044;&#23450;&#20041;&#30340;&#20540;&#65292;&#24182;&#25552;&#20379;&#19968;&#20123;&#26041;&#27861;&#26469;&#35775;&#38382;&#36825;&#20123;&#20540;&#21644;&#25191;&#34892;&#30456;&#20851;&#30340;&#25805;&#20316;&#12290;<\/p>\n<p>&#20197;&#19979;&#26159;&#22914;&#20309;&#22312; PHP &#20013;&#21019;&#24314;&#21644;&#20351;&#29992;&#26522;&#20030;&#31867;&#22411;&#30340;&#31034;&#20363;&#65306;<\/p>\n<ol>\n<li>&#21019;&#24314;&#26522;&#20030;&#31867;&#22411;&#65306;&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#20026;&#26522;&#20030;&#23450;&#20041;&#19968;&#20010;&#21517;&#31216;&#12290;&#20363;&#22914;&#65292;&#25105;&#20204;&#21487;&#20197;&#23558;&#25105;&#20204;&#30340;&#26522;&#20030;&#21629;&#21517;&#20026; <code>Color<\/code>&#65292;&#24182;&#23450;&#20041;&#23427;&#26377;&#19977;&#31181;&#39068;&#33394;&#65306;red, blue &#21644; green&#12290;<\/li>\n<\/ol>\n<pre><code class=\"language-php\">&lt;?php\n\n\/\/ &#23450;&#20041;&#26522;&#20030;&#31867;&#22411;\nclass Color {\n    const RED = 1;\n    const BLUE = 2;\n    const GREEN = 3;\n\n    \/\/ &#33719;&#21462;&#26522;&#20030;&#39033;&#30340;&#26041;&#27861;\n    public static function get($color) {\n        return self::RED === $color ? 'Red' : self::BLUE === $color ? 'Blue' : self::GREEN === $color ? 'Green' : null;\n    }\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#23450;&#20041;&#20102;&#19968;&#20010;&#21517;&#20026; <code>Color<\/code> &#30340;&#26522;&#20030;&#65292;&#20854;&#20013;&#21253;&#21547;&#20102;&#19977;&#20010;&#26522;&#20030;&#39033;&#65306;&#32418;&#33394;&#12289;&#34013;&#33394;&#21644;&#32511;&#33394;&#12290;&#28982;&#21518;&#25105;&#20204;&#21019;&#24314;&#20102;&#19968;&#20010;&#38745;&#24577;&#26041;&#27861; <code>get()<\/code> &#26469;&#33719;&#21462;&#25351;&#23450;&#30340;&#39068;&#33394;&#23545;&#24212;&#30340;&#23383;&#31526;&#20018;&#12290;<\/p>\n<ol start=\"2\">\n<li>&#20351;&#29992;&#26522;&#20030;&#31867;&#22411;&#65306;&#29616;&#22312;&#65292;&#20320;&#21487;&#20197;&#20687;&#20351;&#29992;&#20219;&#20309;&#20854;&#20182;&#31867;&#19968;&#26679;&#20351;&#29992;&#36825;&#20010;&#26522;&#20030;&#12290;&#20363;&#22914;&#65292;&#22914;&#26524;&#20320;&#24819;&#35201;&#25171;&#21360;&#20986;&#25152;&#26377;&#39068;&#33394;&#30340;&#21517;&#23383;&#65292;&#20320;&#21487;&#20197;&#36825;&#26679;&#20570;&#65306;<\/li>\n<\/ol>\n<pre><code class=\"language-php\">$colors = array_flip(Color::get());\n\nforeach ($colors as $color =&gt; $name) {\n    echo $color . ': ' . $name . \"n\";\n}\n\n\/\/ &#36755;&#20986;:\n\/\/ Red: Red\n\/\/ Blue: Blue\n\/\/ Green: Green<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#20351;&#29992;&#20102; <code>array_flip()<\/code> &#20989;&#25968;&#26469;&#32763;&#36716;&#26522;&#20030;&#20013;&#30340;&#39068;&#33394;&#38190;&#20540;&#23545;&#65292;&#20197;&#20415;&#25105;&#20204;&#21487;&#20197;&#36731;&#26494;&#22320;&#36890;&#36807;&#39068;&#33394;&#20540;&#26469;&#33719;&#21462;&#20854;&#21517;&#23383;&#12290;&#28982;&#21518;&#25105;&#20204;&#36941;&#21382;&#36825;&#20010;&#25968;&#32452;&#65292;&#25171;&#21360;&#20986;&#27599;&#20010;&#39068;&#33394;&#21450;&#20854;&#23545;&#24212;&#30340;&#21517;&#23383;&#12290;<\/p>\n<p>&#36825;&#23601;&#26159;&#22914;&#20309;&#22312; PHP &#20013;&#20351;&#29992;&#26522;&#20030;&#31867;&#22411;&#30340;&#31616;&#21333;&#31034;&#20363;&#12290;&#36825;&#21482;&#26159;&#19968;&#20010;&#22522;&#26412;&#30340;&#20363;&#23376;&#65292;&#23454;&#38469;&#19978;&#26522;&#20030;&#21487;&#20197;&#34987;&#29992;&#20110;&#35768;&#22810;&#19981;&#21516;&#30340;&#22330;&#26223;&#65292;&#21253;&#25324;&#39564;&#35777;&#36755;&#20837;&#12289;&#29983;&#25104;&#38543;&#26426;&#25968;&#31561;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; &#12298;PHP Doctrine&#65306;&#22914;&#20309;&#20351;&#29992;&#26522;&#20030;&#25968;&#25454;&#31867;&#22411;&#12299; &#22312;&#038;#29616..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[45],"tuisongtax":[],"class_list":["post-1109","my1js","type-my1js","status-publish","hentry","my1js2nav-symfony"],"acf":{"qian_art_seotitle":"","qian_art_seotitle_source":{"label":"SEO\u6807\u9898","type":"text","formatted_value":""},"qian_art_seokws":"","qian_art_seokws_source":{"label":"SEO\u5173\u952e\u8bcd","type":"text","formatted_value":""},"qian_art_stzhong":"","qian_art_stzhong_source":{"label":"\u4e2d | \u77ed\u6807\u9898","type":"text","formatted_value":""}},"_links":{"self":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js\/1109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js"}],"about":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/types\/my1js"}],"author":[{"embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/media?parent=1109"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1109"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1109"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}