簡體   English   中英

使用查詢生成器比較Doctrine中序列化列中的值

[英]Compare values in serialized column in Doctrine with Query Builder

我正在為Symfony2項目構建FormType ,但由於需要將一些值與存儲在數據庫中的值進行比較並顯示結果,因此我需要在字段上使用一些查詢生成器。 這就是我所擁有的:

....
->add('servicio', 'entity', array(
    'mapped' => false,
    'class' => 'ComunBundle:TipoServicio',
    'property' => 'nombre',
    'required' => true,
    'label' => false,
    'expanded' => true,
    'multiple' => true,
    'query_builder' => function (EntityRepository $er) {
            return $er->createQueryBuilder('ts')
                        ->where('ts.tipo_usuario = (:tipo)')
                        ->setParameter('tipo', 1);
        }
))
....

但是數據庫表中的tipo_usuario例如存儲為序列化文本:

record1: value1 | a:1:{i:0;s:1:"1";}
record2: value2 | a:4:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";i:3;s:1:"4";}

在第一個表單中,我將有兩種不同的形式(我不知道如何將請求傳遞給表單),例如,我將僅顯示第一個記錄,而對於第二個表單,將顯示第一條和第二條記錄:

第一種形式將顯示:

checkbox: value1

第二種形式將顯示:

checkbox: value1
checkbox: value2

我該如何實現?

我認為,實際上沒有干凈的方法可以在序列化的PHP字符串中進行搜索,尤其是不能使用DQL。

如果確實需要,並且您的基礎RDBMS支持它,則可以使用本機查詢和正則表達式類型的查詢,在序列化數組中搜索特定模式。 但這將是一個非常糟糕的解決方案。

正確的方法是在1:n(OneToMany)關系中創建其他表/實體。

如果您使用的是第三方捆綁包,並且無法修改架構,則可以創建某種附加的查找表並注冊一個事件偵聽器,該事件偵聽器每次在另一個表中包含序列化數組的記錄被保留時都會更新該表。

然后,在進行搜索查詢時,您在附加表上進行DQL聯接以過濾所需的元素。

暫無
暫無

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

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