{"id":1100,"date":"2025-06-12T12:56:35","date_gmt":"2025-06-12T04:56:35","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1100.html"},"modified":"2025-06-12T12:56:35","modified_gmt":"2025-06-12T04:56:35","slug":"doctrine%ef%bc%9a%e5%a6%82%e4%bd%95%e5%ae%9a%e4%b9%89%e4%b8%80%e4%b8%aa%e5%ae%9e%e4%bd%93","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1100.html","title":{"rendered":"Doctrine\uff1a\u5982\u4f55\u5b9a\u4e49\u4e00\u4e2a\u5b9e\u4f53"},"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>Doctrine &#26159;&#19968;&#20010;&#29992;&#20110; PHP &#30340; ORM&#65288;&#23545;&#35937;&#20851;&#31995;&#26144;&#23556;&#65289;&#26694;&#26550;&#65292;&#23427;&#20801;&#35768;&#24320;&#21457;&#32773;&#23558;&#25968;&#25454;&#24211;&#34920;&#26144;&#23556;&#21040;&#31867;&#20013;&#65292;&#24182;&#25552;&#20379;&#20102;&#19968;&#31181;&#22768;&#26126;&#24335;&#30340;&#26041;&#24335;&#26469;&#25805;&#20316;&#25968;&#25454;&#24211;&#25968;&#25454;&#12290;&#35201;&#23450;&#20041;&#19968;&#20010;&#23454;&#20307;&#65292;&#20320;&#38656;&#35201;&#36981;&#24490;&#20197;&#19979;&#20960;&#20010;&#27493;&#39588;&#65306;<\/p>\n<ol>\n<li>\n<p><strong>&#23433;&#35013; Doctrine<\/strong>&#65306;\n&#39318;&#20808;&#65292;&#30830;&#20445;&#20320;&#24050;&#32463;&#23433;&#35013;&#20102; 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<\/li>\n<li>\n<p><strong>&#21019;&#24314;&#23454;&#20307;&#31867;<\/strong>&#65306;\n&#22312;&#20320;&#30340;&#39033;&#30446;&#30446;&#24405;&#19979;&#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#25991;&#20214;&#22841;&#26469;&#23384;&#25918;&#20320;&#30340;&#23454;&#20307;&#31867;&#12290;&#20363;&#22914;&#65292;<code>src\/Entity<\/code>&#12290;<\/p>\n<\/li>\n<li>\n<p><strong>&#23450;&#20041;&#23454;&#20307;&#31867;<\/strong>&#65306;\n&#22312; <code>src\/Entity<\/code> &#25991;&#20214;&#22841;&#20013;&#21019;&#24314;&#19968;&#20010;&#26032;&#30340; PHP &#25991;&#20214;&#65292;&#20363;&#22914; <code>User.php<\/code>&#12290;&#22312;&#36825;&#20010;&#25991;&#20214;&#20013;&#65292;&#23450;&#20041;&#20320;&#30340;&#23454;&#20307;&#31867;&#12290;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppEntity;\n\nuse DoctrineORMMapping as ORM;\n\n\/**\n* @ORMEntity(repositoryClass=\"AppRepositoryUserRepository\")\n*\/\nclass User\n{\n   \/**\n    * @ORMId\n    * @ORMGeneratedValue(strategy=\"AUTO\")\n    * @ORMColumn(type=\"integer\")\n    *\/\n   private $id;\n\n   \/**\n    * @ORMColumn(type=\"string\", length=255)\n    *\/\n   private $username;\n\n   \/**\n    * @ORMColumn(type=\"string\", length=255)\n    *\/\n   private $email;\n\n   \/\/ Getters and Setters\n   public function getId(): ?int\n   {\n       return $this-&gt;id;\n   }\n\n   public function setUsername(string $username): self\n   {\n       $this-&gt;username = $username;\n       return $this;\n   }\n\n   public function getEmail(): ?string\n   {\n       return $this-&gt;email;\n   }\n\n   public function setEmail(string $email): self\n   {\n       $this-&gt;email = $email;\n       return $this;\n   }\n}<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#37197;&#32622;&#23454;&#20307;&#31867;<\/strong>&#65306;\n&#20026;&#20102;&#20351; Doctrine &#33021;&#22815;&#35782;&#21035;&#21644;&#31649;&#29702;&#20320;&#30340;&#23454;&#20307;&#31867;&#65292;&#20320;&#38656;&#35201;&#22312; <code>config\/doctrine.yaml<\/code> &#25991;&#20214;&#20013;&#36827;&#34892;&#37197;&#32622;&#12290;<\/p>\n<pre><code class=\"language-yaml\">doctrine:\n   orm:\n       mappings:\n           AppEntity:\n               is_bundle: false\n               type: annotation\n               dir: '%kernel.project_dir%\/src\/Entity'\n               prefix: 'AppEntity'<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>&#36816;&#34892;&#36801;&#31227;&#21629;&#20196;<\/strong>&#65306;\n&#29983;&#25104;&#25968;&#25454;&#24211;&#34920;&#30340; SQL &#35821;&#21477;&#24182;&#24212;&#29992;&#23427;&#20204;&#12290;<\/p>\n<pre><code class=\"language-bash\">php bin\/console doctrine:migrations:generate\nphp bin\/console doctrine:migrations:migrate<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>&#29616;&#22312;&#65292;&#20320;&#24050;&#32463;&#25104;&#21151;&#22320;&#23450;&#20041;&#20102;&#19968;&#20010; Doctrine &#23454;&#20307;&#12290;&#20320;&#21487;&#20197;&#20351;&#29992;&#36825;&#20010;&#23454;&#20307;&#31867;&#26469;&#21019;&#24314;&#12289;&#35835;&#21462;&#12289;&#26356;&#26032;&#21644;&#21024;&#38500;&#25968;&#25454;&#24211;&#35760;&#24405;&#12290;&#20363;&#22914;&#65292;&#20197;&#19979;&#26159;&#22914;&#20309;&#21019;&#24314;&#19968;&#20010;&#26032;&#29992;&#25143;&#30340;&#31034;&#20363;&#20195;&#30721;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppController;\n\nuse AppEntityUser;\nuse DoctrineORMEntityManagerInterface;\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationRequest;\n\nclass UserController extends AbstractController\n{\n    private $entityManager;\n\n    public function __construct(EntityManagerInterface $entityManager)\n    {\n        $this-&gt;entityManager = $entityManager;\n    }\n\n    public function createUser(Request $request)\n    {\n        $user = new User();\n        $form = $this-&gt;createForm(UserType::class, $user);\n        $form-&gt;handleRequest($request);\n\n        if ($form-&gt;isSubmitted() &amp;&amp; $form-&gt;isValid()) {\n            $this-&gt;entityManager-&gt;persist($user);\n            $this-&gt;entityManager-&gt;flush();\n\n            return $this-&gt;redirectToRoute('user_show', ['id' =&gt; $user-&gt;getId()]);\n        }\n\n        return $this-&gt;render('user\/create.html.twig', [\n            'form' =&gt; $form-&gt;createView(),\n        ]);\n    }\n}<\/code><\/pre>\n<p>&#36825;&#20010;&#31034;&#20363;&#23637;&#31034;&#20102;&#22914;&#20309;&#22312;&#25511;&#21046;&#22120;&#20013;&#20351;&#29992;&#23454;&#20307;&#31867;&#26469;&#22788;&#29702;&#29992;&#25143;&#21019;&#24314;&#35831;&#27714;&#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>&#27010;&#36848;<\/h2><p>Doctrine &#26159;&#19968;&#20010;&#24378;&#22823;&#30340; PHP &#23545;&#35937;&#20851;&#31995;&#26144;&#23556;&#22120;&#65288;ORM&#65289;&#65292;&#20027;&#35201;&#29992;&#20110;&#19982; Symfony &#26694;&#26550;&#32467;&#21512;&#20351;&#29992;&#65292;&#20294;&#20063;&#21487;&#20197;&#20316;&#20026;&#29420;&#31435;&#30340;&#24211;&#20351;&#29992;&#12290;&#22312;&#36825;&#31687;&#25945;&#31243;&#20013;&#65292;&#25105;&#20204;&#23558;&#25506;&#32034;&#22914;&#20309;&#22312; Doctrine &#20013;&#23450;&#20041;&#23454;&#20307;&#65292;&#21253;&#25324;&#20174;&#22522;&#30784;&#21040;&#39640;&#32423;&#30340;&#21508;&#31181;&#29992;&#27861;&#31034;&#20363;&#12290;&#23454;&#20307;&#20195;&#34920; Doctrine &#20013;&#30340;&#19994;&#21153;&#23545;&#35937;&#65292;&#21487;&#20197;&#22312;&#25968;&#25454;&#24211;&#20013;&#25345;&#20037;&#21270;&#23384;&#20648;&#12290;<\/p><p>&#22312;&#28145;&#20837;&#23450;&#20041;&#23454;&#20307;&#20043;&#21069;&#65292;&#24744;&#24212;&#35813;&#23545;PHP&#21644;&#38754;&#21521;&#23545;&#35937;&#32534;&#31243;(OOP)&#26377;&#19968;&#20010;&#22522;&#26412;&#30340;&#29702;&#35299;&#12290;&#27492;&#22806;&#65292;&#24744;&#38656;&#35201;&#26377;&#19968;&#20010;Doctrine ORM&#30340;&#23433;&#35013;&#65292;&#24182;&#19988;&#37197;&#32622;&#20102;&#25968;&#25454;&#24211;&#36830;&#25509;&#12290;<\/p><h2>&#23450;&#20041;&#22522;&#26412;&#23454;&#20307;&#12290;<\/h2><p>&#22312;&#26368;&#22522;&#26412;&#30340;&#23618;&#27425;&#19978;&#65292;Doctrine&#20013;&#30340;&#23454;&#20307;&#23601;&#26159;&#19968;&#20010;&#26144;&#23556;&#21040;&#25968;&#25454;&#24211;&#34920;&#30340;PHP&#31867;&#12290;&#20197;&#19979;&#26159;&#19968;&#20010;&#34920;&#31034;&#20135;&#21697;&#30340;&#31616;&#21333;&#31034;&#20363;&#65306;<\/p><pre><code>&lt;?php\nuse DoctrineORMMapping as ORM;\n\n\/** \n * @ORMEntity\n * @ORMTable(name=\"products\")\n *\/\nclass Product\n{\n    \/** \n     * @ORMId\n     * @ORMGeneratedValue\n     * @ORMColumn(type=\"integer\")\n     *\/\n    private $id;\n\n    \/** \n     * @ORMColumn(type=\"string\")\n     *\/\n    private $name;\n\n    \/\/ Getters and setters\n    public function getId()\n    {\n        return $this-&gt;id;\n    }\n\n    public function setName($name)\n    {\n        $this-&gt;name = $name;\n    }\n\n    public function getName()\n    {\n        return $this-&gt;name;\n    }\n}\n<\/code><\/pre><p>&#36825;&#27573;&#20195;&#30721;&#29255;&#27573;&#23450;&#20041;&#20102;&#19968;&#20010;&#31616;&#21333;&#30340;&#23454;&#20307;&#65292;&#21253;&#21547;&#20004;&#20010;&#23646;&#24615;&#65306;ID&#21644;&#21517;&#31216;&#12290;&#22312;ORMEntity&#27880;&#35299;&#19978;&#22768;&#26126;&#30340;&#31867;&#21578;&#35785;Doctrine&#36825;&#20010;&#31867;&#26159;&#19968;&#20010;&#23454;&#20307;&#12290;&#22312;ORM@Table&#27880;&#35299;&#19978;&#23450;&#20041;&#20102;&#25968;&#25454;&#24211;&#34920;&#21517;&#12290;<\/p><h2>&#21033;&#29992;&#20851;&#31995;<\/h2><p>&#23454;&#20307;&#36890;&#24120;&#19982;&#20854;&#20182;&#23454;&#20307;&#26377;&#20851;&#31995;&#12290;&#35753;&#25105;&#20204;&#22312;&#25105;&#20204;&#30340;Product&#23454;&#20307;&#19978;&#28155;&#21152;&#19968;&#20010;&#22810;&#23545;&#19968;&#30340;&#20851;&#31995;&#65292;&#23558;&#20854;&#19982;Category&#23454;&#20307;&#20851;&#32852;&#36215;&#26469;&#65306;<\/p><pre><code>\/\/ ... existing Product class\n\n\/**\n * @ORMManyToOne(targetEntity=\"Category\")\n * @ORMJoinColumn(name=\"category_id\", referencedColumnName=\"id\")\n *\/\nprivate $category;\n\n\/\/ ... Getters and setters for category\n<\/code><\/pre><p>@ORMManyToMany(targetEntity=&#8221;Category&#8221;) &#34920;&#31034;Product&#21644;Category&#20043;&#38388;&#30340;&#22810;&#23545;&#22810;&#20851;&#31995;&#65292;&#32780;@ORMJoinColumn(name=&#8221;category_id&#8221;, referencedColumnName=&#8221;id&#8221;) &#21017;&#25351;&#23450;&#20102;&#20851;&#32852;&#30340;&#22806;&#38190;&#21015;&#21517;&#21644;&#23545;&#24212;&#30340;&#20027;&#38190;&#23383;&#27573;&#21517;&#12290;<\/p><h2>&#22788;&#29702;&#22797;&#26434;&#30340;&#20154;&#38469;&#20851;&#31995;<\/h2><p>Doctrine&#25552;&#20379;&#20102;&#22810;&#31181;&#20851;&#31995;&#31867;&#22411;&#65292;&#22914;&#19968;&#23545;&#19968;&#12289;&#19968;&#23545;&#22810;&#21644;&#22810;&#23545;&#22810;&#12290;&#35753;&#25105;&#20204;&#28155;&#21152;&#19968;&#20010;&#21452;&#21521;&#30340;&#19968;&#23545;&#22810;&#20851;&#31995;&#65292;&#26144;&#23556;&#20135;&#21697;&#21040;&#22810;&#20010;&#35780;&#35770;&#65306;<\/p><pre><code>\/**\n * @ORMOneToMany(targetEntity=\"Review\", mappedBy=\"product\")\n *\/\nprivate $reviews;\n\npublic function __construct() {\n    $this-&gt;reviews = new DoctrineCommonCollectionsArrayCollection();\n}\n\n\/\/ ... Getters and setters for reviews \n<\/code><\/pre><p>&#36825;&#24314;&#31435;&#20102;&ldquo;&#19968;&#23545;&#19968;&rdquo;&#20851;&#31995;&#65292;&#21363;&#19968;&#20010;&#20135;&#21697;&#21487;&#20197;&#26377;&#22810;&#20010;&#35780;&#35770;&#12290;mappedBy &#23646;&#24615;&#25351;&#21521;&#20851;&#31995;&#30340;&#19968;&#20391;&#12290;<\/p><h2>&#39640;&#32423;&#22320;&#22270;&#36873;&#39033;<\/h2><p>&#23454;&#20307;&#21487;&#20197;&#36827;&#19968;&#27493;&#33258;&#23450;&#20041;&#65292;&#20351;&#29992;&#39640;&#32423;&#36873;&#39033;&#12290;&#20363;&#22914;&#65292;&#21578;&#35785;Doctrine&#21482;&#21152;&#36733;&#20851;&#32852;&#23454;&#20307;&#26102;&#24310;&#36831;&#21152;&#36733;&#65292;&#25110;&#32773;&#25351;&#23450;&#21807;&#19968;&#32422;&#26463;&#65306;<\/p><pre><code>\/**\n * @ORMEntity\n * @ORMTable(name=\"products\", uniqueConstraints={@ORMUniqueConstraint(name=\"product_name_unique\", columns={\"name\"})})\n *\/\nclass Product\n{\n    \/\/ ... Class content remains the same\n}\n\n\/\/Specify lazy loading for the relationship\n\/**\n * @ORMManyToOne(targetEntity=\"Category\", fetch=\"LAZY\")\n * @ORMJoinColumn(name=\"category_id\", referencedColumnName=\"id\")\n *\/\nprivate $category;\n<\/code><\/pre><p>&#21807;&#19968;&#32422;&#26463;&#36873;&#39033;&#30830;&#20445;&#20135;&#21697;&#21517;&#31216;&#22312;products&#34920;&#20869;&#26159;&#21807;&#19968;&#30340;&#12290;ManyToOne&#20851;&#31995;&#20013;&#30340;fetch&#35774;&#32622;&#20026;LAZY&#65292;&#24847;&#21619;&#30528;Doctrine&#21482;&#26377;&#24403;&#35775;&#38382;Category&#23454;&#20307;&#26102;&#25165;&#20250;&#21152;&#36733;&#23427;&#12290;<\/p><h2>Doctrina Callbacks Lifecycle<\/h2><p>Doctrine &#25552;&#20379;&#20102;&#29983;&#21629;&#21608;&#26399;&#22238;&#35843;&#65292;&#36825;&#20123;&#26041;&#27861;&#21487;&#20197;&#22312;&#23454;&#20307;&#30340;&#29983;&#21629;&#21608;&#26399;&#20013;&#30340;&#29305;&#23450;&#28857;&#34987;&#33258;&#21160;&#35843;&#29992;&#65292;&#20363;&#22914;&#22312;&#20445;&#23384;&#21040;&#25968;&#25454;&#24211;&#20043;&#21069;&#25110;&#20174;&#25968;&#25454;&#24211;&#21152;&#36733;&#20043;&#21518;&#12290;&#35201;&#21033;&#29992;&#36825;&#20123;&#21151;&#33021;&#65292;&#35831;&#22312;&#24744;&#30340;&#23454;&#20307;&#20013;&#23450;&#20041;&#23427;&#20204;&#24182;&#37197;&#32622; Doctrine &#20351;&#29992;&#23427;&#20204;&#65306;<\/p><pre><code>\/**\n * @ORMHasLifecycleCallbacks()\n *\/\nclass Product\n{\n    \/\/ ...\n\n    \/**\n     * @ORMPrePersist\n     *\/\n    public function setCreatedAtValue()\n    {\n        if(!$this-&gt;createdAt) {\n            $this-&gt;createdAt = new DateTime();\n        }\n    }\n    \/\/ ...\n}\n<\/code><\/pre><p>&#22312;&#19978;&#36848;&#31034;&#20363;&#20013;&#65292;setCreatedAtValue() &#26041;&#27861;&#23558;&#22312; Doctrine &#25345;&#20037;&#21270;&#23454;&#20307;&#20043;&#21069;&#34987;&#35843;&#29992;&#65292;&#33258;&#21160;&#35774;&#32622;&#19968;&#20010;&#21019;&#24314;&#26102;&#38388;&#25139;&#65288;&#22914;&#26524;&#35813;&#23383;&#27573;&#20026; NULL&#65289;&#12290;<\/p><h2>&#19982;&#32034;&#24341;&#24037;&#20316;<\/h2><p>&#20320;&#21487;&#20197;&#20026;&#23454;&#20307;&#23450;&#20041;&#32034;&#24341;&#20197;&#25552;&#39640;&#24615;&#33021;&#12290;&#22312;&#36825;&#37324;&#65292;&#25105;&#20204;&#22312;&#20135;&#21697;&#34920;&#30340;&#21517;&#31216;&#21015;&#19978;&#28155;&#21152;&#20102;&#19968;&#20010;&#32034;&#24341;&#65306;<\/p><pre><code>\/**\n * @ORMEntity\n * @ORMTable(name=\"products\", indexes={@ORMIndex(name=\"product_name_index\", columns={\"name\"})})\n *\/\nclass Product\n{\n    \/\/ ... Existing content\n}\n<\/code><\/pre><p>&#32034;&#24341;&#22312;&#22788;&#29702;&#22823;&#22411;&#25968;&#25454;&#38598;&#25110;&#39057;&#32321;&#25628;&#32034;&#25110;&#36830;&#25509;&#21015;&#30340;&#22330;&#26223;&#23588;&#20854;&#37325;&#35201;&#12290;<\/p><h2>&#32467;&#35770;&#12290;<\/h2><p>&#23450;&#20041;&#23454;&#20307;&#26159;&#20351;&#29992;Doctrine ORM&#36827;&#34892;&#24037;&#20316;&#30340;&#37325;&#35201;&#22522;&#30784;&#12290;&#22312;&#26412;&#25945;&#31243;&#20013;&#65292;&#25105;&#20204;&#24050;&#32463;&#35752;&#35770;&#20102;&#21019;&#24314;&#23454;&#20307;&#12289;&#22788;&#29702;&#20851;&#31995;&#12289;&#28155;&#21152;&#39640;&#32423;&#26144;&#23556;&#36873;&#39033;&#12289;&#20351;&#29992;&#29983;&#21629;&#21608;&#26399;&#22238;&#35843;&#20197;&#21450;&#32034;&#24341;&#31561;&#20869;&#23481;&#12290;Doctrine&#30340;&#23454;&#20307;&#20351;&#24744;&#33021;&#22815;&#20197;&#38754;&#21521;&#23545;&#35937;&#30340;PHP&#26041;&#24335;&#19982;&#25968;&#25454;&#24211;&#20132;&#20114;&#65292;&#20174;&#32780;&#33719;&#24471;&#32467;&#26500;&#21270;&#21644;&#24378;&#22823;&#30340;&#26041;&#27861;&#26469;&#25805;&#20316;&#25968;&#25454;&#12290;&#35760;&#20303;&#65292;&#27599;&#20010;&#23454;&#20307;&#37117;&#24212;&#35813;&#26377;&#19968;&#20010;&#26126;&#30830;&#30340;&#30446;&#30340;&#65292;&#24182;&#19988;&#24212;&#35813;&#21453;&#26144;&#24744;&#30340;&#25968;&#25454;&#24211;&#32467;&#26500;&#12290;&#26377;&#20102;&#36825;&#20123;&#27010;&#24565;&#21644;&#31034;&#20363;&#65292;&#24744;&#23601;&#21487;&#20197;&#25484;&#25569;&#23450;&#20041;Doctrine&#23454;&#20307;&#30340;&#33402;&#26415;&#20102;&#12290;<\/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>&#35201;&#22312; Doctrine &#20013;&#23450;&#20041;&#19968;&#20010;&#23454;&#20307;&#65292;&#20320;&#38656;&#35201;&#36981;&#24490;&#20197;&#19979;&#27493;&#39588;&#65306;<\/p>\n<ol>\n<li>&#39318;&#20808;&#30830;&#20445;&#24050;&#32463;&#23433;&#35013;&#20102; Doctrine &#21644; Doctrine 2 &#30340; PHP &#29256;&#26412;&#12290;<\/li>\n<li>&#22312;&#20320;&#30340;&#39033;&#30446;&#20013;&#21019;&#24314;&#19968;&#20010;&#26032;&#30340; Doctrine &#34920;&#26684;&#26144;&#23556;&#25991;&#20214;&#65288;&#36890;&#24120;&#21629;&#21517;&#20026; <code>doctrine.php<\/code>&#65289;&#65292;&#24182;&#22312;&#20854;&#20013;&#28155;&#21152;&#20320;&#30340;&#23454;&#20307;&#31867;&#12290;<\/li>\n<\/ol>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppEntity;\n\nuse DoctrineORMMapping as ORM;\nuse SymfonyComponentValidatorConstraints as Assert;\n\n\/**\n * @ORMEntity(repositoryClass=\"AppRepositoryUserRepository\")\n *\/\nclass User\n{\n    \/**\n     * @ORMId\n     * @ORMGeneratedValue\n     * @ORMColumn(type=\"integer\")\n     *\/\n    private $id;\n\n    \/**\n     * @ORMColumn(type=\"string\", length=50)\n     * @AssertNotBlank(message=\"Username is required.\")\n     *\/\n    private $username;\n\n    \/**\n     * @ORMColumn(type=\"string\", length=50, nullable=true)\n     *\/\n    private $email;\n\n    \/**\n     * @ORMColumn(type=\"string\", length=150, nullable=true)\n     *\/\n    private $password;\n\n    \/**\n     * @ORMColumn(type=\"datetime\")\n     *\/\n    private $createdAt;\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 getEmail(): ?string\n    {\n        return $this-&gt;email;\n    }\n\n    public function setEmail(?string $email): self\n    {\n        $this-&gt;email = $email;\n\n        return $this;\n    }\n\n    public function getPassword(): ?string\n    {\n        return $this-&gt;password;\n    }\n\n    public function setPassword(?string $password): self\n    {\n        $this-&gt;password = $password;\n\n        return $this;\n    }\n\n    public function getCreatedAt(): ?DateTimeInterface\n    {\n        return $this-&gt;createdAt;\n    }\n\n    public function setCreatedAt(DateTimeInterface $createdAt): self\n    {\n        $this-&gt;createdAt = $createdAt;\n\n        return $this;\n    }\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#23450;&#20041;&#20102;&#19968;&#20010;&#21517;&#20026; <code>User<\/code> &#30340;&#23454;&#20307;&#65292;&#24182;&#20351;&#29992;&#20102; <code>@ORMEntity<\/code> &#27880;&#35299;&#26469;&#25351;&#31034;&#23427;&#26159; Doctrine &#34920;&#26684;&#30340;&#20027;&#20307;&#12290;&#25105;&#20204;&#36824;&#35774;&#32622;&#20102;&#34920;&#23383;&#27573;&#65292;&#22914; ID&#12289;&#29992;&#25143;&#21517;&#12289;&#30005;&#23376;&#37038;&#20214;&#21644;&#23494;&#30721;&#31561;&#12290;&#27880;&#24847;&#65292;&#25105;&#20204;&#36824;&#25552;&#20379;&#20102;&#39564;&#35777;&#32422;&#26463;&#26469;&#26816;&#26597;&#36825;&#20123;&#23383;&#27573;&#26159;&#21542;&#20026;&#38750;&#31354;&#12290;<\/p>\n<h3>&#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#20551;&#35774;&#20320;&#26377;&#19968;&#20010;&#29992;&#25143;&#27169;&#22411;&#38656;&#35201;&#20445;&#23384;&#21040;&#25968;&#25454;&#24211;&#20013;&#65292;&#20320;&#21487;&#20197;&#36825;&#26679;&#20570;&#65306;<\/p>\n<pre><code class=\"language-php\">\/\/ Model\/User.php\nnamespace AppModel;\n\nuse DoctrineCommonCollectionsArrayCollection;\nuse DoctrineORMMapping as ORM;\n\n\/**\n * Class User\n * @package AppModel\n * @ORMEntity(repositoryClass=\"AppRepositoryUserRepository\")\n *\/\nclass User\n{\n    \/\/ ...\n}\n\n\/\/ Repository\/UserRepository.php\nnamespace AppRepository;\n\nuse DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;\nuse DoctrinePersistenceManagerRegistry;\n\n\/**\n * Class UserRepository\n * @package AppRepository\n * @method User|null find($id, $lockMode = null, $lockVersion = null)\n * @method User|null findOneBy(array $criteria, array $orderBy = null)\n * @method User[]    findAll()\n * @method User[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)\n *\/\nclass UserRepository extends ServiceEntityRepository\n{\n    public function __construct(ManagerRegistry $registry)\n    {\n        parent::__construct($registry, 'app_user');\n    }\n}\n\n\/\/ Controller\/Controller.php\nnamespace AppController;\n\nuse AppEntityUser;\nuse AppFormUserType;\nuse AppRepositoryUserRepository;\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentHttpFoundationResponse;\nuse SymfonyComponentRoutingAnnotationRoute;\n\n\/**\n * @Route(\"\/users\")\n *\/\nclass UserController extends AbstractController\n{\n    \/**\n     * @Route(\"\/\", name=\"users_index\", methods={\"GET\"})\n     *\/\n    public function index(UserRepository $userRepository): Response\n    {\n        $users = $userRepository-&gt;findAll();\n\n        return $this-&gt;render('users\/index.html.twig', [\n            'users' =&gt; $users,\n        ]);\n    }\n}<\/code><\/pre>\n<p>&#20197;&#19978;&#23601;&#26159;&#22312; Doctrine &#20013;&#23450;&#20041;&#23454;&#20307;&#30340;&#22522;&#26412;&#27493;&#39588;&#12290;&#36825;&#21482;&#26159;&#19968;&#20010;&#22522;&#26412;&#30340;&#20363;&#23376;&#65292;&#23454;&#38469;&#24212;&#29992;&#21487;&#33021;&#20250;&#26681;&#25454;&#20855;&#20307;&#38656;&#27714;&#36827;&#34892;&#20462;&#25913;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; Doctrine &#26159;&#19968;&#20010;&#29992;&#20110; PHP &#30340; ORM&#65288;&#23545;&#35937;&#20851;&#31995;&#26144;&#23556;&#65289;&#038;#..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[45],"tuisongtax":[],"class_list":["post-1100","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\/1100","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=1100"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1100"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1100"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}