Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 批量导入时,如何填写多人关系字段?_Php_Symfony_Doctrine Orm_Symfony4 - Fatal编程技术网

Php 批量导入时,如何填写多人关系字段?

Php 批量导入时,如何填写多人关系字段?,php,symfony,doctrine-orm,symfony4,Php,Symfony,Doctrine Orm,Symfony4,我正在尝试导入一批记录(账单),但我(与客户)有多对一关系。 如何填写该关系的DB列 我在实体内部使用类似于fromArray的函数,我在其中传递字段列表和一条记录的值(数据源是CSV)。然后在该函数中,我只需将每个列的值赋给相应的属性。但是,属性Customer是一个对象,因此我需要传入一个我没有的对象 我曾考虑将实体经理注入我的实体,但这被视为一种可怕的做法,所以我有点被卡住了 我还尝试添加一个额外的属性customerId,希望它能够强制写入值,但它似乎坚持关系值而不是属性值 这是我的密码

我正在尝试导入一批记录(账单),但我(与客户)有多对一关系。 如何填写该关系的DB列

我在实体内部使用类似于
fromArray
的函数,我在其中传递字段列表和一条记录的值(数据源是CSV)。然后在该函数中,我只需将每个列的值赋给相应的属性。但是,属性Customer是一个对象,因此我需要传入一个我没有的对象

我曾考虑将实体经理注入我的实体,但这被视为一种可怕的做法,所以我有点被卡住了

我还尝试添加一个额外的属性
customerId
,希望它能够强制写入值,但它似乎坚持关系值而不是属性值

这是我的密码:

类账单
/**
*@var字符串
*
*@ORM\Column(name=“docId”,type=“string”,length=25,nullable=false)
*@ORM\Id
*/
私人$id;
/**
*@var float|null
*
*@ORM\Column(name=“amount”,type=“float”,精度=10,刻度=0,可空=true)
*/
私人金额$;
/**
*@ORM\manytone(targetEntity=“App\Entity\Customer”,inversedBy=“bills”)
*@ORM\JoinColumn(name=“customerId”,referencedColumnName=“customerId”,nullable=false)
*/
私人$客户;
公共函数getCustomer():?客户
{
返回$this->customer;
}
公共函数setCustomer($customer):self
{
$this->customer=$customer;
退还$this;
}
//这是我们进口的地方
CSVRecord($header,$line)中的公共静态函数
{
$object=新的自我;
foreach($key=>$field形式的标题){
试一试{
交换机($field){
案例“customerId”:
//从他们那里把客户带到这里,但我们没有他们
$customer=$em->getRepository(customer::class)->find($line[$key]);
$object->setCustomer($customer);
打破
违约:
$object->$field=$line[$key];
打破
}
}捕获(\异常$e){
dd($line[$key]);
}
}
返回$object;
}
}

我希望有一种简单的方法可以使用ORM导入记录值,而不必将实体管理器注入实体类。

您的问题是,您试图将此责任赋予错误的类。您需要实体内部的实体管理器的巨大代码气味,您正确地感知到了这一点,这让您觉得执行该操作的位置不对

将其移动到存储库。无论如何,这是一个更符合逻辑的地方来处理这个问题,而且您已经有了可用的实体管理器

class BillRepository扩展了ServiceEntityRepository
{
//..
公共函数addFromCSVRecord($header,$line){
$em=$this->getEntityManager();
$bill=新账单();
foreach($key=>$field形式的标题){
试一试{
交换机($field){
案例“customerId”:
$customer=$em->getRepository(customer::class)->find($line[$key]);
//或者,如果您确定传入数据,并且不想点击数据库。。。
//$customer=$this->getEntityManager()->getReference(客户:类,$line[$key]);
$bill->setCustomer($customer);
打破
违约:
$bill->$field=$line[$key];
打破
}
}catch(\Exception$e){dd($line[$key]);}
}
//返回$object;
$em->persist($bill);
$em->flush();
}
} 
我留下了我在你的方法中发现的大部分逻辑,因为我不知道细节。虽然更改了用于实际持久化数据的
返回值
,但只需调用
addFromCsvRecord()
即可在数据库中创建并持久化新对象


请注意,在我的回答中,我向您展示了如何使用
EntityManager::getReference()
为客户生成对象引用。如果您可以信任输入文件,这将稍微快一点,因为您不需要点击该对象的DB。

您看到下面的答案了吗?运气好吗?正如@yivi所建议的,将导入功能移动到它自己的类或存储库可能是最好的选择。另一方面,您可以考虑只将实体管理器添加为参数清单::FROMCVScript($Head,$Load,$EnTyManager)。在任何情况下,都可以使用EntityManager::getReference($customerId),而不是加载整个customer对象。会快一点的。谢谢!!实际上,您对存储库位有一个看法。来自Laravel的背景,我总是忘记存储库类的存在不仅仅是为了获取记录:PGlad它帮助了你。Laravel/Elount使用ActiveRecord模式,在Doctrine中使用DataMapper和Repository模式;我相信这一切都好得多。