{"id":1106,"date":"2025-06-12T13:04:18","date_gmt":"2025-06-12T05:04:18","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/symfony\/1106.html"},"modified":"2025-06-12T13:04:18","modified_gmt":"2025-06-12T05:04:18","slug":"symfony%e4%b8%8edoctrine%e7%9a%84crud%e6%93%8d%e4%bd%9c%ef%bc%9a%e6%95%99%e7%a8%8b%e4%b8%8e%e7%a4%ba%e4%be%8b","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/1106.html","title":{"rendered":"Symfony\u4e0eDoctrine\u7684CRUD\u64cd\u4f5c\uff1a\u6559\u7a0b\u4e0e\u793a\u4f8b"},"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;Symfony&#19982;Doctrine&#30340;CRUD&#25805;&#20316;&#65306;&#25945;&#31243;&#19982;&#31034;&#20363;&#12299;<\/p>\n<p>&#22312;&#29616;&#20195;Web&#24320;&#21457;&#20013;&#65292;&#25968;&#25454;&#31649;&#29702;&#26159;&#33267;&#20851;&#37325;&#35201;&#30340;&#37096;&#20998;&#12290;Symfony&#21644;Doctrine&#36825;&#20004;&#20010;&#24378;&#22823;&#30340;&#26694;&#26550;&#21487;&#20197;&#31616;&#21270;&#36825;&#19968;&#36807;&#31243;&#65292;&#24110;&#21161;&#24320;&#21457;&#32773;&#24555;&#36895;&#21019;&#24314;&#21644;&#32500;&#25252;&#25968;&#25454;&#24211;&#34920;&#12290;&#19979;&#38754;&#65292;&#25105;&#20204;&#23558;&#36890;&#36807;&#19968;&#20010;&#31616;&#21333;&#30340;&#31034;&#20363;&#26469;&#20171;&#32461;&#22914;&#20309;&#20351;&#29992;Symfony&#21644;Doctrine&#36827;&#34892;CRUD&#65288;Create, Read, Update, Delete&#65289;&#25805;&#20316;&#12290;<\/p>\n<h3>1. &#23433;&#35013;Symfony&#21644;Doctrine<\/h3>\n<p>&#39318;&#20808;&#65292;&#30830;&#20445;&#20320;&#24050;&#32463;&#23433;&#35013;&#20102;PHP&#21644;Composer&#12290;&#28982;&#21518;&#65292;&#20351;&#29992;Composer&#21019;&#24314;&#19968;&#20010;&#26032;&#30340;Symfony&#39033;&#30446;&#65306;<\/p>\n<pre><code class=\"language-bash\">composer create-project symfony\/skeleton my_project --prefer-dist\ncd my_project<\/code><\/pre>\n<p>&#25509;&#19979;&#26469;&#65292;&#28155;&#21152; Doctrine&#21040;&#20320;&#30340;<code>composer.json<\/code>&#25991;&#20214;&#20013;&#65306;<\/p>\n<pre><code class=\"language-json\">{\n    \"require\": {\n        \"symfony\/framework-bundle\": \"^5.4\",\n        \"doctrine\/doctrine-bundle\": \"^2.7\"\n    }\n}<\/code><\/pre>\n<p>&#36816;&#34892; Composer&#26356;&#26032;&#65306;<\/p>\n<pre><code class=\"language-bash\">composer update<\/code><\/pre>\n<h3>2. &#37197;&#32622;Doctrine<\/h3>\n<p>&#25171;&#24320;<code>config\/packages\/dev\/doctrine.yaml<\/code>&#25991;&#20214;&#65292;&#24182;&#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: my_database\n                user: root\n                password: ''\n                charset: utf8mb4\n                server_version: '5.7'\n    orm:\n        auto_generate_proxy_classes: true\n        naming_strategy: doctrine.orm.naming_strategies.underscore\n        mappings:\n            AppEntity:\n                type: annotation\n                dir: '%kernel.project_dir%\/src\/Entity'\n                prefix: 'App\\Entity\\'<\/code><\/pre>\n<h3>3. &#21019;&#24314;&#23454;&#20307;&#31867;<\/h3>\n<p>&#22312;<code>src\/Entity<\/code>&#30446;&#24405;&#19979;&#21019;&#24314;&#19968;&#20010;&#21517;&#20026;<code>User.php<\/code>&#30340;&#23454;&#20307;&#31867;&#65306;<\/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    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        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<h3>4. &#21019;&#24314;Repository&#31867;<\/h3>\n<p>&#22312;<code>src\/Repository<\/code>&#30446;&#24405;&#19979;&#21019;&#24314;&#19968;&#20010;&#21517;&#20026;<code>UserRepository.php<\/code>&#30340;Repository&#31867;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppRepository;\n\nuse DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;\nuse SymfonyBridgeDoctrineRegistryInterface;\n\nclass UserRepository extends ServiceEntityRepository\n{\n    public function __construct(RegistryInterface $registry)\n    {\n        parent::__construct($registry, User::class);\n    }\n\n    \/\/ Add your custom query methods here\n}<\/code><\/pre>\n<h3>5. &#21019;&#24314;&#25511;&#21046;&#22120;<\/h3>\n<p>&#22312;<code>src\/Controller<\/code>&#30446;&#24405;&#19979;&#21019;&#24314;&#19968;&#20010;&#21517;&#20026;<code>UserController.php<\/code>&#30340;&#25511;&#21046;&#22120;&#31867;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppController;\n\nuse AppEntityUser;\nuse AppFormUserType;\nuse DoctrinePersistenceObjectManager;\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentRoutingAnnotationRoute;\n\nclass UserController extends AbstractController\n{\n    #[Route('\/user', name: 'app_user_index')]\n    public function index(ObjectManager $entityManager): Response\n    {\n        $users = $entityManager-&gt;getRepository(User::class)-&gt;findAll();\n        return $this-&gt;render('user\/index.html.twig', [\n            'users' =&gt; $users,\n        ]);\n    }\n\n    #[Route('\/user\/new', name: 'app_user_new', methods: ['GET', 'POST'])]\n    public function new(Request $request, ObjectManager $entityManager): Response\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            $entityManager-&gt;persist($user);\n            $entityManager-&gt;flush();\n\n            return $this-&gt;redirectToRoute('app_user_index');\n        }\n\n        return $this-&gt;render('user\/new.html.twig', [\n            'form' =&gt; $form-&gt;createView(),\n        ]);\n    }\n\n    #[Route('\/user\/{id}', name: 'app_user_show', requirements: 'id=d+')]\n    public function show(User $user): Response\n    {\n        return $this-&gt;render('user\/show.html.twig', [\n            'user' =&gt; $user,\n        ]);\n    }\n\n    #[Route('\/user\/{id}\/edit', name: 'app_user_edit', methods: ['GET', 'POST'])]\n    public function edit(Request $request, User $user, ObjectManager $entityManager): Response\n    {\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            $entityManager-&gt;persist($user);\n            $entityManager-&gt;flush();\n\n            return $this-&gt;redirectToRoute('app_user_index');\n        }\n\n        return $this-&gt;render('user\/edit.html.twig', [\n            'form' =&gt; $form-&gt;createView(),\n            'user' =&gt; $user,\n        ]);\n    }\n\n    #[Route('\/user\/{id}\/delete', name: 'app_user_delete', methods: ['DELETE'])]\n    public function delete(Request $request, User $user, ObjectManager $entityManager): Response\n    {\n        $this-&gt;denyAccessUnlessGranted('ROLE_ADMIN');\n\n        $entityManager-&gt;remove($user);\n        $entityManager-&gt;flush();\n\n        return $this-&gt;redirectToRoute('app_user_index');\n    }\n}<\/code><\/pre>\n<h3>6. &#21019;&#24314;&#35270;&#22270;<\/h3>\n<p>&#22312;<code>templates\/user<\/code>&#30446;&#24405;&#19979;&#21019;&#24314;&#20197;&#19979;&#35270;&#22270;&#25991;&#20214;&#65306;<\/p>\n<ul>\n<li><code>index.html.twig<\/code><\/li>\n<li><code>new.html.twig<\/code><\/li>\n<li><code>show.html.twig<\/code><\/li>\n<li><code>edit.html.twig<\/code><\/li>\n<\/ul>\n<p>&#36825;&#20123;&#35270;&#22270;&#23558;&#36127;&#36131;&#26174;&#31034;&#29992;&#25143;&#21015;&#34920;&#12289;&#26032;&#29992;&#25143;&#34920;&#21333;&#12289;&#29992;&#25143;&#35814;&#32454;&#20449;&#24687;&#20197;&#21450;&#32534;&#36753;&#29992;&#25143;&#30340;&#34920;&#21333;&#12290;<\/p>\n<h3>&#24635;&#32467;<\/h3>\n<p>&#36890;&#36807;&#20197;&#19978;&#27493;&#39588;&#65292;&#25105;&#20204;&#25104;&#21151;&#22320;&#20351;&#29992;Symfony&#21644;Doctrine&#36827;&#34892;&#20102;&#22522;&#26412;&#30340;CRUD&#25805;&#20316;&#12290;&#36825;&#20010;&#31034;&#20363;&#23637;&#31034;&#20102;&#22914;&#20309;&#23450;&#20041;&#23454;&#20307;&#31867;&#12289;&#21019;&#24314;Repository&#31867;&#12289;&#32534;&#20889;&#25511;&#21046;&#22120;&#24182;&#21019;&#24314;&#30456;&#24212;&#30340;&#35270;&#22270;&#12290;&#38543;&#30528;&#39033;&#30446;&#30340;&#25193;&#23637;&#65292;&#20320;&#21487;&#20197;&#36827;&#19968;&#27493;&#25506;&#32034;&#26356;&#22810;&#30340;&#21151;&#33021;&#21644;&#20248;&#21270;&#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>&#24320;&#21457;&#39640;&#25928;Web&#24212;&#29992;&#38656;&#35201;&#19968;&#20010;&#24378;&#22823;&#30340;&#26694;&#26550;&#19982;&#19968;&#20010;&#39640;&#25928;&#30340;ORM&#65288;&#23545;&#35937;&#20851;&#31995;&#26144;&#23556;&#65289;&#24037;&#20855;&#30456;&#32467;&#21512;&#12290;Symfony&#26159;&#19968;&#20010;&#21463;&#27426;&#36814;&#30340;PHP&#26694;&#26550;&#65292;&#32780;Doctrine&#21017;&#26159;&#19968;&#27454;&#24378;&#22823;&#30340;ORM&#12290;&#22312;&#36825;&#20010;&#25945;&#31243;&#20013;&#65292;&#25105;&#20204;&#23558;&#28145;&#20837;&#25506;&#35752;&#22914;&#20309;&#20351;&#29992;Symfony&#21644;Doctrine&#23454;&#29616;CRUD&#25805;&#20316;&mdash;&mdash;&#21019;&#24314;&#12289;&#35835;&#21462;&#12289;&#26356;&#26032;&#21644;&#21024;&#38500;&#12290;<\/p><h3>CRUD &#25805;&#20316;&#27010;&#36848;<\/h3><p>&#25968;&#25454;&#25805;&#20316;&#30340;&#22522;&#26412;&#21151;&#33021;&#23545;&#20110;&#20219;&#20309;&#24212;&#29992;&#31243;&#24207;&#31649;&#29702;&#25968;&#25454;&#26469;&#35828;&#37117;&#26159;&#24517;&#19981;&#21487;&#23569;&#30340;&#12290;&#20197;&#19979;&#26159;&#27599;&#20010;&#26415;&#35821;&#30340;&#20855;&#20307;&#21547;&#20041;&#65306;<\/p><p>&#21024;&#38500;&#65306;&#20174;&#24744;&#30340;&#25968;&#25454;&#24211;&#20013;&#21024;&#38500;&#25968;&#25454;&#30340;&#25805;&#20316;&#12290;<\/p><p>&#26356;&#26032;&#65306;&#23545;&#24744;&#25968;&#25454;&#24211;&#20013;&#30340;&#29616;&#26377;&#25968;&#25454;&#36827;&#34892;&#20462;&#25913;&#25805;&#20316;&#12290;<\/p><p>&#35835;&#21462;&#65306;&#20174;&#25968;&#25454;&#24211;&#26816;&#32034;&#25968;&#25454;&#30340;&#34892;&#20026;&#12290;<\/p><p>&#21019;&#24314;&#65306;&#23558;&#26032;&#25968;&#25454;&#28155;&#21152;&#21040;&#25968;&#25454;&#24211;&#30340;&#36807;&#31243;&#12290;<\/p><h2>&#35774;&#32622; Symfony &#21644; Doctrine<\/h2><p>&#22312;&#28145;&#20837;&#20195;&#30721;&#20043;&#21069;&#65292;&#35831;&#30830;&#20445;&#24050;&#23433;&#35013;Symfony&#12290;&#22914;&#26524;&#27809;&#26377;&#65292;&#24744;&#21487;&#20197;&#21442;&#32771;&#26412;&#25945;&#31243;&#20013;&#30340;Symfony&#23433;&#35013;&#25351;&#21335;&#65306;&#22914;&#20309;&#35774;&#32622;&#21644;&#37197;&#32622;Symfony&#12290;&#26377;&#20102;Symfony&#20043;&#21518;&#65292;&#35753;&#25105;&#20204;&#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#39033;&#30446;&#65306;<\/p><pre><code>symfony new my_project --full<\/code><\/pre><p>&#20026;&#20102;&#24320;&#22987;&#19982;Doctrine&#19968;&#36215;&#24037;&#20316;&#65292;&#35831;&#25171;&#24320;&#24744;&#30340;&#39033;&#30446;&#30446;&#24405;&#65306;<\/p><pre><code>cd my_project<\/code><\/pre><h2>&#21019;&#24314;&#19968;&#20010;&#23454;&#20307;<\/h2><p>&#19968;&#20010;&ldquo;&#23454;&#20307;&rdquo;&#22312;Doctrine&#20013;&#20195;&#34920;&#25968;&#25454;&#24211;&#20013;&#30340;&#19968;&#20010;&#34920;&#12290;&#20551;&#35774;&#25105;&#20204;&#35201;&#21019;&#24314;&#19968;&#20010;<code>Product<\/code>&#23454;&#20307;&#65306;<\/p><pre><code>php bin\/console make:entity Product<\/code><\/pre><p>&#28982;&#21518;&#65292;&#25511;&#21046;&#21488;&#23558;&#20250;&#25552;&#31034;&#24744;&#36755;&#20837;&#29992;&#20110;&#36523;&#20221;&#39564;&#35777;&#30340;&#23383;&#27573;&#12290;<code>Product<\/code>&#23454;&#20307;&#12290;&#19968;&#26086;&#23436;&#25104;&#65292;&#24744;&#21487;&#20197;&#20026;&#24744;&#30340;&#25968;&#25454;&#24211;&#21019;&#24314;&#30456;&#24212;&#30340;&#34920;&#65306;<\/p><pre><code>php bin\/console doctrine:migrations:migrate<\/code><\/pre><p>&#35813;&#21629;&#20196;&#20250;&#29983;&#25104;&#25152;&#38656;&#30340;SQL&#26597;&#35810;&#24182;&#26356;&#26032;&#25968;&#25454;&#24211;&#12290;<\/p><h2>&#21019;&#24314;&#25805;&#20316;<\/h2><p>&#20026;&#20102;&#21521;&#25105;&#20204;&#30340;&#25968;&#25454;&#24211;&#28155;&#21152;&#25968;&#25454;&#65292;&#25105;&#20204;&#23558;&#21019;&#24314;&#19968;&#20010;&#26032;&#30340;<code>Product<\/code>&#20351;&#29992;Doctrine&#30340;EntityManager&#23545;&#35937;&#21644;&#25345;&#20037;&#21270;&#23427;&#65306;<\/p><pre><code>\n\/\/ src\/Controller\/ProductController.php\n\nuse AppEntityProduct;\nuse DoctrineORMEntityManagerInterface;\nuse SymfonyComponentHttpFoundationResponse;\n\npublic function createProduct(EntityManagerInterface $entityManager): Response\n{\n    $product = new Product();\n    $product-&gt;setName('Keyboard')-&gt;setPrice(1999);\n\n    $entityManager-&gt;persist($product);\n    $entityManager-&gt;flush();\n\n    return new Response('Saved new product with id '.$product-&gt;getId());\n}\n<\/code><\/pre><h2>&#38405;&#35835;&#25805;&#20316;<\/h2><p>&#35835;&#21462;&#25968;&#25454;&#28041;&#21450;&#20351;&#29992;EntityManager&#65288;&#25110;Repository&#65289;&#26469;&#26816;&#32034;&#29305;&#23450;&#35760;&#24405;&#25110;&#19968;&#32452;&#35760;&#24405;&#65306;<\/p><pre><code>\n\/\/ src\/Controller\/ProductController.php\n\nuse AppRepositoryProductRepository;\n\npublic function showProduct(ProductRepository $productRepository, int $productId): Response\n{\n    $product = $productRepository-&gt;find($productId);\n\n    if (!$product) {\n        throw $this-&gt;createNotFoundException('No product found for id '.$productId);\n    }\n\n    \/\/ ... (do something, like return a view)\n}\n<\/code><\/pre><h2>&#26356;&#26032;&#25805;&#20316;<\/h2><p>&#20026;&#20102;&#26356;&#26032;&#35760;&#24405;&#65292;&#39318;&#20808;&#36890;&#36807;&#20179;&#24211;&#26816;&#32034;&#35813;&#39033;&#65292;&#28982;&#21518;&#36827;&#34892;&#20462;&#25913;&#24182;&#25345;&#20037;&#21270;&#65306;<\/p><pre><code>\n\/\/ src\/Controller\/ProductController.php\n\npublic function updateProduct(EntityManagerInterface $entityManager, int $productId): Response\n{\n    $product = $entityManager-&gt;getRepository(Product::class)-&gt;find($productId);\n\n    if (!$product) {\n        throw $this-&gt;createNotFoundException('No product found for id '.$productId);\n    }\n\n    $product-&gt;setName('New Keyboard Name');\n    $entityManager-&gt;flush();\n\n    return new Response('Product updated!');\n}\n<\/code><\/pre><h2>&#21024;&#38500;&#25805;&#20316;<\/h2><p>&#21024;&#38500;&#35760;&#24405;&#23601;&#20687;&#26816;&#32034;&#23454;&#20307;&#24182;&#20511;&#21161;EntityManager&#23558;&#20854;&#20174;&#25968;&#25454;&#24211;&#20013;&#31227;&#38500;&#19968;&#26679;&#31616;&#21333;&#65306;<\/p><pre><code>\n\/\/ src\/Controller\/ProductController.php\n\npublic function deleteProduct(EntityManagerInterface $entityManager, int $productId): Response\n{\n    $product = $entityManager-&gt;getRepository(Product::class)-&gt;find($productId);\n\n    if ($product) {\n        $entityManager-&gt;remove($product);\n        $entityManager-&gt;flush();\n    }\n\n    return new Response('Product deleted if it existed.');\n}\n<\/code><\/pre><h2>&#32467;&#35770;&#12290;<\/h2><p>&#36825;&#20010;&#25945;&#31243;&#35302;&#21450;&#20102;Symfony&#21644;Doctrine&#21487;&#20197;&#19968;&#36215;&#20570;&#21040;&#30340;&#34920;&#38754;&#20869;&#23481;&#12290;&#25105;&#20204;&#23398;&#20250;&#20102;&#36827;&#34892;&#20219;&#20309;&#24212;&#29992;&#31243;&#24207;&#25152;&#38656;&#30340;&#22522;&#26412;CRUD&#25805;&#20316;&#12290;&#23545;&#20110;&#36827;&#19968;&#27493;&#30340;&#35265;&#35299;&#21644;&#39640;&#32423;&#21151;&#33021;&#65292;&#35831;&#21442;&#38405;Symfony&#23448;&#26041;&#25991;&#26723;&#12290;<\/p><p>&#35760;&#20303;&#65292;&#25928;&#29575;&#26469;&#33258;&#20110;&#23454;&#36341;&#65292;&#19981;&#26029;&#26681;&#25454;&#23545;Symfony&#29305;&#24615;&#21644;Doctrine&#33021;&#21147;&#30340;&#29702;&#35299;&#26469;&#37325;&#26500;&#20195;&#30721;&#65292;&#21487;&#20197;&#30830;&#20445;&#39033;&#30446;&#28789;&#27963;&#24615;&#21644;&#20581;&#22766;&#24615;&#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>Symfony&#21644;Doctrine&#26159;&#20004;&#20010;&#24120;&#29992;&#30340;PHP&#26694;&#26550;&#65292;&#23427;&#20204;&#21487;&#20197;&#29992;&#26469;&#26500;&#24314;&#22823;&#22411;&#20225;&#19994;&#32423;&#24212;&#29992;&#12290;&#19979;&#38754;&#25105;&#20204;&#23558;&#35752;&#35770;&#22914;&#20309;&#20351;&#29992;&#36825;&#20123;&#24211;&#26469;&#23454;&#29616;&#22522;&#26412;&#30340;CRUD&#65288;&#21019;&#24314;&#12289;&#35835;&#21462;&#12289;&#26356;&#26032;&#12289;&#21024;&#38500;&#65289;&#25805;&#20316;&#12290;<\/p>\n<h3>1. &#21019;&#24314;&#25968;&#25454;&#24211;&#34920;<\/h3>\n<p>&#39318;&#20808;&#65292;&#25105;&#20204;&#38656;&#35201;&#23450;&#20041;&#25105;&#20204;&#30340;&#25968;&#25454;&#27169;&#22411;&#65292;&#36825;&#36890;&#24120;&#28041;&#21450;&#21040;&#23450;&#20041;&#34920;&#32467;&#26500;&#12290;&#20363;&#22914;&#65292;&#25105;&#20204;&#26377;&#20197;&#19979;SQL&#35821;&#21477;&#65306;<\/p>\n<pre><code class=\"language-sql\">CREATE TABLE users (\n    id INT AUTO_INCREMENT PRIMARY KEY,\n    name VARCHAR(255) NOT NULL,\n    email VARCHAR(255) UNIQUE NOT NULL\n);<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#23450;&#20041;&#20102;&#19968;&#20010;&#21517;&#20026;<code>users<\/code>&#30340;&#34920;&#65292;&#20854;&#20013;&#21253;&#21547;&#19977;&#20010;&#23383;&#27573;&#65306;<code>id<\/code>&#12289;<code>name<\/code>&#21644;<code>email<\/code>&#12290;&#36825;&#37324;&#65292;<code>id<\/code>&#26159;&#20027;&#38190;&#65292;&#29992;&#20110;&#21807;&#19968;&#26631;&#35782;&#27599;&#20010;&#29992;&#25143;&#65307;<code>name<\/code>&#21644;<code>email<\/code>&#37117;&#26159;&#38750;&#31354;&#23383;&#31526;&#20018;&#31867;&#22411;&#65292;&#29992;&#20110;&#23384;&#20648;&#29992;&#25143;&#30340;&#22995;&#21517;&#21644;&#30005;&#23376;&#37038;&#20214;&#22320;&#22336;&#12290;<\/p>\n<h3>2. &#20351;&#29992; Doctrine ORM&#36827;&#34892;CRUD&#25805;&#20316;<\/h3>\n<p>&#22312;Symfony&#39033;&#30446;&#20013;&#65292;&#25105;&#20204;&#21487;&#20197;&#20351;&#29992;ORM&#65288;&#23545;&#35937;&#20851;&#31995;&#26144;&#23556;&#65289;&#21151;&#33021;&#26469;&#31616;&#21270;&#25968;&#25454;&#24211;&#25805;&#20316;&#12290;&#39318;&#20808;&#65292;&#25105;&#20204;&#38656;&#35201;&#23433;&#35013;ORM&#39537;&#21160;&#65292;&#22914; doctrine-mongodb-driver &#25110; doctrine-odm-orm&#12290;<\/p>\n<p>&#25509;&#19979;&#26469;&#65292;&#25105;&#20204;&#23558;&#21019;&#24314;&#19968;&#20010;&#23454;&#20307;&#31867;&#26469;&#34920;&#31034;&#29992;&#25143;&#65306;<\/p>\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=255)\n     * @AssertNotBlank(message=\"Name is required.\")\n     *\/\n    private $name;\n\n    \/**\n     * @ORMColumn(type=\"string\", length=255, unique=true)\n     * @AssertEmail(message=\"Invalid email format.\")\n     *\/\n    private $email;\n\n    \/\/ getters and setters...\n}<\/code><\/pre>\n<p>&#29616;&#22312;&#65292;&#25105;&#20204;&#21487;&#20197;&#21019;&#24314;&#19968;&#20010;&#26381;&#21153;&#31867;&#26469;&#22788;&#29702;ORM&#25805;&#20316;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppService;\n\nuse AppEntityUser;\nuse DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;\nuse DoctrineCommonPersistenceManagerRegistry;\n\nclass UserRepository extends ServiceEntityRepository\n{\n    public function __construct(ManagerRegistry $registry)\n    {\n        parent::__construct($registry, User::class);\n    }\n\n    public function save(User $entity, bool $flush = true): void\n    {\n        $this-&gt;getEntityManager()-&gt;persist($entity);\n        if ($flush) {\n            $this-&gt;getEntityManager()-&gt;flush();\n        }\n    }\n\n    public function findOneBy(array $criteria = [], array $orderBy = []): ?User\n    {\n        return $this-&gt;createQueryBuilder('u')\n            -&gt;select('u')\n            -&gt;where(\n                $this-&gt;expr()\n                    -&gt;in(\n                        'u.email',\n                        $criteria['emails']\n                    )\n            )\n            -&gt;addOrderBy('u.name', $orderBy['name'])\n            -&gt;getQuery()\n            -&gt;getOneOrNullResult()\n        ;\n    }\n}<\/code><\/pre>\n<h3>3. &#23454;&#29616;CRUD&#25805;&#20316;<\/h3>\n<p>&#29616;&#22312;&#65292;&#35753;&#25105;&#20204;&#32534;&#20889;&#19968;&#20123;&#25511;&#21046;&#22120;&#26469;&#22788;&#29702;CRUD&#25805;&#20316;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppController;\n\nuse AppEntityUser;\nuse AppFormUserType;\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentHttpFoundationRequest;\nuse SymfonyComponentHttpFoundationResponse;\nuse SymfonyComponentRoutingAnnotationRoute;\n\nclass UserController extends AbstractController\n{\n    #[Route('\/users', name: 'app_users')]\n    public function index(): Response\n    {\n        $users = $this-&gt;getDoctrine()\n            -&gt;getRepository(User::class)\n            -&gt;findAll();\n\n        return $this-&gt;render('index.html.twig', [\n            'users' =&gt; $users,\n        ]);\n    }\n\n    #[Route('\/users\/{id}', name: 'app_user_show')]\n    public function show(User $user): Response\n    {\n        return $this-&gt;render('show.html.twig', [\n            'user' =&gt; $user,\n        ]);\n    }\n\n    #[Route('\/users\/new', name: 'app_user_new')]\n    public function new(Request $request): Response\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            $entityManager = $this-&gt;getDoctrine()-&gt;getManager();\n            $entityManager-&gt;persist($user);\n            $entityManager-&gt;flush();\n\n            return $this-&gt;redirectToRoute('app_user_show', ['id' =&gt; $user-&gt;getId()]);\n        }\n\n        return $this-&gt;renderForm('new.html.twig', [\n            'user' =&gt; $user,\n            'form' =&gt; $form,\n        ]);\n    }\n\n    #[Route('\/users\/{id}\/edit', name: 'app_user_edit')]\n    public function edit(User $user, Request $request): Response\n    {\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;getDoctrine()-&gt;getManager()-&gt;flush();\n\n            return $this-&gt;redirectToRoute('app_user_show', ['id' =&gt; $user-&gt;getId()]);\n        }\n\n        return $this-&gt;renderForm('edit.html.twig', [\n            'user' =&gt; $user,\n            'form' =&gt; $form,\n        ]);\n    }\n}<\/code><\/pre>\n<h3>&#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#36825;&#27573;&#20195;&#30721;&#23637;&#31034;&#20102;&#22914;&#20309;&#20351;&#29992;Symfony&#21644;Doctrine&#36827;&#34892;CRUD&#25805;&#20316;&#12290;&#27880;&#24847;&#65292;&#36825;&#37324;&#30340;&#20195;&#30721;&#20551;&#35774;&#25105;&#20204;&#26377;&#19968;&#20010;&#21517;&#20026;<code>doctrine-mongodb-driver<\/code>&#30340;ORM&#39537;&#21160;&#12290;&#22914;&#26524;&#20320;&#20351;&#29992;&#30340;&#26159;&#20854;&#20182;&#39537;&#21160;&#65292;&#21482;&#38656;&#23558;<code>DoctrineORMEntityManagerInterface<\/code>&#26367;&#25442;&#20026;&#30456;&#24212;&#30340;&#39537;&#21160;&#12290;<\/p>\n<p>&#36825;&#20010;&#31034;&#20363;&#23637;&#31034;&#20102;&#19968;&#20010;&#31616;&#21333;&#30340;CRUD&#25511;&#21046;&#22120;&#65292;&#23427;&#20801;&#35768;&#20320;&#22312;&#27983;&#35272;&#22120;&#19978;&#21019;&#24314;&#12289;&#26174;&#31034;&#21644;&#32534;&#36753;&#29992;&#25143;&#35760;&#24405;&#12290;&#20320;&#21487;&#20197;&#26681;&#25454;&#38656;&#35201;&#28155;&#21152;&#26356;&#22810;&#30340;&#36335;&#30001;&#12289;&#35270;&#22270;&#21644;&#39564;&#35777;&#35268;&#21017;&#26469;&#22686;&#24378;&#27492;&#24212;&#29992;&#31243;&#24207;&#30340;&#21151;&#33021;&#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;Symfony&#19982;Doctrine&#30340;CRUD&#25805;&#20316;&#65306;&#25945;&#31243;&#19982;&#31034;&#20363;&#12299; &#22312;&#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-1106","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\/1106","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=1106"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=1106"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=1106"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=1106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}