我正在尝试在事务中进行一些处理并保存有关潜在故障的信息,如下所示:
$conn->beginTransaction();
try
{
$report = $reportRepository->find($id);
$user = $report->getUser();
$specification = new Specification();
$entityManager->persist($specification);
throw new ProcessingWentWrongException();
$entityManager->flush();
$conn->commit();
}
catch(ProcessingWentWrongException $e)
{
$conn->rollback();
// Store error info:
$report->setState('error');
$entityManager->persist($report);
$entityManager->flush(); // all hell breaks loose in here
}
Run Code Online (Sandbox Code Playgroud)
这看起来像一个非常常见的模式,但是Doctrine让它变得非常困难:
flush
在catch{}
节会尽量坚持既$report
和$specification
这显然是错误的对象,所以我可以clear
的entityManager
,但后来......
如果我clear
的entityManager
,$report
通过它不再管理,所以我需要调用$em->merge($report)
,以使其再次进行管理.显然$user
会保持不受管理,所以学说要么表现insert
要么抱怨persist cascade
.所以我可以是merge()
整个图形(很糟糕)或者close
是entityManager,但是...
如果我close
,entityManager
我只能report
通过 …
假设我有一个Booking
实体,它有一个state
可以设置为几个值的一个领域-让我们把它:NEW
,ACCEPTED
,和REJECTED
我正在寻找实现这一目标的"正确"方式.到目前为止,我使用了这样的方法:
class Booking
{
const STATUS_NEW = 0;
const STATUS_ACCEPTED = 1;
const STATUS_REJECTED = 2;
protected $status = self::STATUS_ACTIVE;
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我真的很好奇"正确"的做法,我也有这个方法的一些问题:
它看起来非常像隐藏在实体类中的业务逻辑 - 如果实体应该是a POJO
,那为什么它会关心状态呢?所以我可以把它放在一个经理类中:
class BookingManager
{
const STATUS_NEW = 0;
const STATUS_ACCEPTED = 1;
const STATUS_REJECTED = 2;
public function setBookingStatus(Booking $b, $status) { }
}
Run Code Online (Sandbox Code Playgroud)
但它仍然无法解决第二个问题:
很难在视图中重复使用这些数据,让我们以一个树枝为例 - 我必须创建一个Twig Extension才能将数字转换为实际名称:
Status type: {{ booking.status }}
Status name: {{ booking.status|statusName }}{# I don't like this approach …
Run Code Online (Sandbox Code Playgroud)我目前正在使用require.js
开发,所以我可以快速迭代(更改文件,刷新页面,之间没有构建步骤),但我使用它webpack
作为构建工具,因为它优于r.js
.我想完全摆脱require.js并在开发中使用webpack作为脚本加载器.我知道这正是webpack dev server
为了什么,但我特别不想使用它.
理想情况下,我只需要包含某种webpack加载器<script>
,将其指向我的webpack.js
构建配置,然后让它完成工作.
我想使用 WebRTC 将两个视频流从 Peer1 发送到 Peer2:让我们以前置和后置摄像头为例。
从概念上讲,Peer2 如何知道哪个流来自哪个相机?
MediaStream 文档提到 allMediaStream
和MediaStreamTrack
字段都是只读的,因此我无法直接向它们附加任何信息。我不能像{"stream1 id": "camera", "stream2 id": "screenshare"}
通过信令通道那样发送字典,因为 Peer2 将为每个流和轨道生成自己的 id。
我正在维护 google chrome 的一个扩展程序,我收到随机用户的投诉,说它刚刚停止工作。
“扩展”部分中的错误消息是这样的:
Chrome plugin - Permission chrome-devtools://*/* is unknown or URL pattern is malformed
Run Code Online (Sandbox Code Playgroud)
似乎这不是一个非常受欢迎的问题 - 我找不到任何痕迹。我的清单文件的权限部分如下所示:
"permissions": [
"tabs", "http://*/*", "https://*/*", "chrome-devtools://*/*"
]
Run Code Online (Sandbox Code Playgroud)
它对大多数人都很好
google-chrome google-chrome-extension google-chrome-devtools
如果我已经使用的迁移,我可以使用易于产生递增的:
app/console doctrine:migrations:diff
。
但假设我有一个尚未使用迁移的现有应用程序。doctrine:migrations:diff
只会在当前数据库模式和学说实体之间生成差异。问题是我需要对到目前为止CREATE TABLE
创建的每个实体进行初始/第一次迁移。我当前的解决方法是创建一个空数据库,在 中切换凭据parameters.yml
,然后运行doctrine:migrations:diff
。
我不喜欢这个解决方案 - 有更好的解决方案吗?
我正在开发一个工具来合并两个具有相同架构但不同数据的数据库。
其中一部分是将所有外键更改为ON UPDATE CASCADE
,然后递增所有主键以避免冲突并保持外键指针正常工作。
我的问题是,有时会有一些 FK 损坏的孤立行,因此以下查询:
UPDATE table set pk = pk + 1000000
Run Code Online (Sandbox Code Playgroud)
像这样失败:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
...(尽管我什至没有考虑触摸外键列!)
我想通过以下方式关闭它:
Set foreign_key_checks=0
Run Code Online (Sandbox Code Playgroud)
但随后相关的外键不会更新。我做了一个快速测试,设置foreign_key_checks = 0后级联不起作用。
有没有办法触发级联,或者在不设置的情况下执行 FK 损坏的行的更新foreign_key_checks=0
?UPDATE IGNORE
没有解决这个问题:(
mysql database foreign-keys foreign-key-relationship sql-update
假设我正在使用一个指令,该指令通过双向绑定以 unix 时间戳的形式给出日期,但还提供了一个日历小部件来更改选择。
日历小部件使用日期对象,我无法更改输入数据格式,并且我不想重新设计日历以支持 unix 时间戳。另外,这只是一个例子,问题是关于循环观察者的一般工作方式。
范围如下所示:
scope.selectedUnixTimestamp; // this comes from the outside
scope.selectedDate;
scope.$watch('selectedUnixTimestamp', function(newV, oldV) {
$scope.selectedDate = new Date(newV*1000);
});
scope.$watch('selectedDate', function(newV, oldV) {
$scope.selectedUnixTimestamp = Math.floor(newV.getTime()/1000 + 0.000001);
});
Run Code Online (Sandbox Code Playgroud)
我的问题是:我该怎么做才能避免额外调用 $watch 回调?显然,如果我选择新日期,流程将如下:
但除了第一个电话之外,我不想再打任何电话。我怎样才能实现它?
显然,一种方法是执行以下操作:
scope.selectedUnixTimestamp;
scope.selectedDate;
var surpressWatch1 = false;
var surpressWatch2 = false;
scope.$watch('selectedUnixTimestamp', function(newV, oldV) {
if(surpressWatch1) { surpressWatch1 = false; return; } …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的项目中采用webpack dev服务器.我知道它被广泛采用,所以我很惊讶调试应用程序似乎很难.由于webpack默认生成一个巨型包,因此源映射是必须的.我有一个很大的问题:
根据devtool
模式,源映射要么很难解析(eval
),要么不用于映射某些堆栈跟踪(eval-source-map
),例如,整个堆栈跟踪有时会如下所示:
at eval (eval at <anonymous> http://localhost:8082/js/app.js:2004:2), <anonymous>:43:67)
.
此外,当您手动调用console.trace或console.error时,不会映射输出.所以你必须使用像sourcemapped-stacktrace这样的工具- 这既缓慢又容易出错.
目前我使用require.js进行开发,因为它允许我非常容易地调试应用程序 - 每个堆栈跟踪指向正确的文件和行.
如何使用webpack实现相同的结果?
编辑:
谷歌浏览器中的相关问题:https://code.google.com/p/chromium/issues/detail? id = 376409
firefox中的相关问题:https://bugzilla.mozilla.org/show_bug.cgi? id = 583083
我有一个简单的模型:
class InvitationRequest(models.Model):
email = models.EmailField(max_length=255, unique=True)
Run Code Online (Sandbox Code Playgroud)
一个简单的模型形式:
class InvitationRequestForm(forms.ModelForm):
class Meta:
model = InvitationRequest
Run Code Online (Sandbox Code Playgroud)
现在,假设我尝试以标准方式处理它:
form = InvitationRequestForm(request.POST)
if form.is_valid():
form.save()
Run Code Online (Sandbox Code Playgroud)
存在竞争条件,因为验证执行简单SELECT
查询以确定是否已经存储了这样的电子邮件,并且如果一切正常,则它继续进行form.save()
.如果有一个并发进程在同一时刻执行相同操作,则两个表单都将验证,并且两个进程都将调用,form.save()
因此一个将成功,另一个将失败导致IntegrityError
.
处理这个问题的标准方法是什么?
我希望在表单对象中有一个标准错误,因此我可以将其传递给模板并通知用户该问题.
我知道:
SERIALIZABLE
事务包装所有东西(在MySQL中,因为它执行下一个键锁定每次选择)Model._perform_unique_checks
并使其使用select_for_update
(由于下一个键锁定,与MySQL一起使用)这些解决方案都没有吸引力,我也使用PostgreSQL,它与MySQL在这个领域不同.
我正在寻找一种方法来列出与 Trello 板相关的所有附件,但我发现的只是获取与卡片相关的附件列表。有没有办法在不枚举每张卡片的情况下获取所有电路板附件的列表?
javascript ×4
doctrine-orm ×3
symfony ×3
doctrine ×2
mysql ×2
php ×2
webpack ×2
angularjs ×1
build ×1
database ×1
django ×1
foreign-keys ×1
node.js ×1
postgresql ×1
python ×1
requirejs ×1
sql-update ×1
trello ×1
validation ×1
webrtc ×1