簡體   English   中英

Symfony 5 - Doctrine schema_filter 不工作

[英]Symfony 5 - Doctrine with schema_filter not working

當我在我的項目中執行命令行doctrine:schema:update --force時,我試圖忽略兩個實體,他們是這樣寫的:

/**
 * @ORM\Entity(readOnly=true)
 * @ORM\Table(name="view_tableau_de_bord")
 */
class ViewTableauDeBord
{
    //...
}

在我的 doctrine.yaml 配置文件中:

doctrine:
dbal:
    default_connection: default

    connections:
        default:
            url: '%env(resolve:DATABASE_URL)%'
            driver: 'pdo_pgsql'
            server_version: '12'
            charset: utf8
            schema_filter: ~^(?!view_)~
        # ...

當我的視圖在schema_filter中時,Doctrine 不斷生成所有實體。 你對此有解釋嗎? 這是我第一次在項目中使用此選項。

項目配置:

  • Symfony 5.4.14
  • PHP 7.4.26
  • doctrine:orm: 2.13.3
  • 學說/注釋:1.13.3
  • 學說/學說捆綁:2.7.0
  • 學說/學說遷移包:3.2.2
  • symfony/學說橋:5.4.14
  • 學說/數據裝置:1.5.3

更新正確解釋的答案。

schema_filter不是用來“過濾”實體的,而是用來從 doctrine 意識中過濾 db 表的。

這是一個例子:
假設您手動創建一個表,該表從名為view_booking_by_customer_per_year的自定義原始 php cronjob 更新,您的項目中的代碼不使用該表,但用於數據分析。

這是一個典型示例,您不希望 doctrine 每次要更新架構時都生成這樣的查詢。

DROP TABLE view_booking_by_customer_per_year; // NO I DONT WANT THIS

所以使用schema_filter你可以告訴 doctrine 在他的驗證和更新過程中忽略這個表。

嘗試使用原始 sql 創建隨機表並使用doctrine:schema:validate 它將顯示database is not in sync錯誤。 一旦你把它放在 schema_filter 中,錯誤就不會再發生了。

它適用於doctrine:migration:diffdoctrine:schema:update

但是如果你想避免在數據庫內部生成一個實體,那么可以從 Ernesto 的答案中的鏈接中找到這個:

 schema_ignore_classes:
   - Reference\To\My\Class
   - Reference\To\My\OtherClass

只能從 Doctrine 2.7 版本開始工作。 您可以在此處找到完整的示例: 運行架構管理器更新時忽略 Doctrine2 實體

我強烈建議您使用doctrine:migration:diff然后使用doctrine:migration:migrate而不是doctrine:schema:update來對數據庫執行更改。 這對本地開發人員來說沒問題,但在生產中這是一個非常糟糕的做法。

https://symfony.com/bundles/DoctrineMigrationsBundle/current/index.html

並且; 抱歉我之前回答的很短哈哈:)

標有readOnly=true標志的實體不再被更新跟蹤,但仍然可以插入或刪除行,如文檔中所述。

doctrine:schema:update命令仍會考慮表以更新模式。

“運行架構管理器更新時忽略 Doctrine2 實體”問題的答案中,有 3 個有效選項可以忽略架構更新中的實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM