使用数据映射器模式:
\n\n如何在$user->name不了解数据映射器和存储(即$user不能简单地调用$userDataMapper->count(\'name=\'.$this->name))的情况下验证对象/实体(例如)中的唯一字段?
class User\n{\n private $name; // unique\n\n public function validate(): bool\n {\n // what to put here to validate that $this->name\n // is unique in column `users`.`name`?\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n到目前为止,我知道有两种可能的解决方案(其中一种是由 tere\xc5\xa1ko 建议的),但都有缺点。
\n\ntere\xc5\xa1ko 建议的第一个方法是捕获 PDOException。
\n\nclass UserDataMapper\n{\n public function store($user)\n {\n $sql = \'INSERT INTO `users` SET `name` = :name, `email_address` = :emailAddress...\';\n $params =\n [\n \'name\' => $user->getName(),\n \'emailAddress\' => …Run Code Online (Sandbox Code Playgroud) I\xe2\x80\x99m 在后端使用 Slim 3 PHP 创建身份验证/登录系统,在前端使用 Angular,并且 I\xe2\x80\x99m 尝试理解 \xe2\x80\x98domain 对象\xe2 \x80\x99 和 \xe2\x80\x98data mapper\xe2\x80\x99 是 MVC 结构中模型层的一部分。我\xe2\x80\x99已经阅读了很多关于诸如此类的问题的有用答案,从中我了解到模型应该由\xe2\x80\x98domain对象\xe2\x80\x99、\xe2\x80\x98data组成映射器\xe2\x80\x99 和\xe2\x80\x98services\xe2\x80\x99。
\n\n然而,我\xe2\x80\x99m 不太确定在用户能够注册并登录网站的情况下应该如何构建它。
\n\n根据我的理解,我可以拥有一个具有用户名和密码等属性的用户“域对象”。它还可以具有注册或登录等方法来表示业务逻辑。
\n\n然后我是否会有一个服务类来创建用户对象的新实例,在其中我将表单数据传递到该对象中?那么现在我的用户对象实例将设置用户名和密码值?
\n\n现在我不确定如何将此对象属性数据插入到数据库中。我是否可以使用用户对象注册方法通过传入用户名和密码作为参数来将数据插入数据库?
\n\n显然,服务应该是域对象和数据映射器交互的地方,但我不确定如果注册方法位于用户域对象中,这将如何工作。
\n\n我希望有人可以向我展示一些代码示例,说明服务类中应包含哪些内容,以及域对象和数据映射器之间的交互如何在用户注册和登录的上下文中工作。
\n\n注意我不想使用任何框架,我想尝试手动实现正确的 MVC 结构,因为我觉得我会了解更多。
\n\n到目前为止,我有这样的结构来注册用户:
\n\n我有一个带有 registerUser 方法的 AuthenticationController 来允许用户创建帐户:
\n\n class AuthenticationController\n{\n protected $authenticationService;\n\n public function __construct(AuthenticationService $authenticationService)\n {\n $this->authenticationService = $authenticationService;\n }\n\n public function registerUser($request, $response)\n {\n $this->authenticationService->registerUser($request, $response);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后我有带有 registerUser 方法的 AuthenticationService 类:
\n\nclass AuthenticationService\n{\n protected $database;\n\n public …Run Code Online (Sandbox Code Playgroud) 我想将网络 DTO(其余 api 响应)转换为 Kotlin 中的数据库 DTO。网络 DTO 包含一个列表作为字段,该列表中的项目还包含其他数据的列表。下面是网络响应或网络DTO的表示
{
categories: [
{
catId: 0,
name: "Category A",
products: [
{
prodId: 900,
name: "Product 1"
ingredients: [
{
name: "Ingre 1"
}
]
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想提取并转换所有类别的列表,然后将所有产品的列表,然后将所有成分的列表转换为三个单独的列表,并且还想将这些数据转换为各自的数据库 DTO。
我已经创建了一段代码来执行所需的任务,但我确信存在性能问题,并且必须有一些更 kotlinish 的解决方案。
val dbCategories = networkCategories?.map {
DBCategory(
catId = it.catId,
name = it.name
)
}
val dbProducts = networkCategories?.map { it.networkProducts }?.map {
it.map { singleNetworkProduct ->
DBProduct(
prodId = singleNetworkProduct.prodId,
name = singleNetworkProduct.name,
)
}
}?.flatten() …Run Code Online (Sandbox Code Playgroud) 我正在尝试重现我与ActiveRecord一起使用的SQL查询:
Post.all(:conditions => ["EXTRACT(MONTH from created_at) = ? AND EXTRACT(YEAR from created_at) = ?", month, year])
Run Code Online (Sandbox Code Playgroud)
但是因为我正在将所有内容转换为DataMapper,所以我正在寻找一种方法来做到这一点......
有人可以帮忙吗?
我将从rails 3 app迁移,它使用AR和arel到datamapper.我喜欢像Person.where(...)这样的范围链.其中(...).somescope.paginate(...).order(...).如何从这种方法迁移到datamapper.
我在datamapper中有以下模型:
class Student
include DataMapper::Resource
property :id, Serial
# <snip>
property :permissions, String, :accessor => :protected, :required => true, :default => 'standard'
property :valid, Boolean, :default => false, :required => true
# <snip>
end
Run Code Online (Sandbox Code Playgroud)
在要求'dm-validations'(版本1.1.0)并启动我的Sinatra应用程序后,我收到以下消息:
/Library/Ruby/Gems/1.8/gems/dm-validations-1.1.0/lib/dm-validations.rb:81:in `valid?': wrong number of arguments (1 for 0) (ArgumentError)
from /Library/Ruby/Gems/1.8/gems/dm-validations-1.1.0/lib/dm-validations.rb:81:in `save_self'
from /Library/Ruby/Gems/1.8/gems/dm-core-1.1.0/lib/dm-core/resource.rb:1007:in `_save'
from /Library/Ruby/Gems/1.8/gems/dm-core-1.1.0/lib/dm-core/resource.rb:1223:in `run_once'
from /Library/Ruby/Gems/1.8/gems/dm-core-1.1.0/lib/dm-core/resource.rb:1006:in `_save'
from /Library/Ruby/Gems/1.8/gems/dm-core-1.1.0/lib/dm-core/resource.rb:406:in `save'
from /Library/Ruby/Gems/1.8/gems/dm-validations-1.1.0/lib/dm-validations.rb:69:in `save'
from /Library/Ruby/Gems/1.8/gems/dm-validations-1.1.0/lib/dm-validations/support/context.rb:30:in `validation_context'
from /Library/Ruby/Gems/1.8/gems/dm-validations-1.1.0/lib/dm-validations.rb:69:in `save'
<snip>
我正在为我的模型使用的"有效"名称是保留字吗?如果是,我在哪里可以找到这些单词.我接下来试着给它命名:'student_valid',但现在我真的很好奇.
谢谢
我刚开始使用Datamapper.
我正在尝试update一个对象.我使用它的id获取对象/模型:
u1 = User.get(1)
u1.name = "xyz"
u1.update
Run Code Online (Sandbox Code Playgroud)
抛出错误/引发异常.我再试一次:
u1 = User.get(1)
Run Code Online (Sandbox Code Playgroud)
在那之后:
u1.update({:name => "xyz"})
Run Code Online (Sandbox Code Playgroud)
将抛出虚假并dirty?返回true.
之后,任何调用update都会失败,说它很脏.
我可以通过以下方式进行保存:
u1.name = "xyz"
u1.save
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
get(id)甚至改变一个领域?update?语法是什么:user.update({ ....})或user.name = "xyz"; user.update?dirty?,并且一旦我使对象变脏,我是否必须将对象从数据库中刷新到变量?我一直是sqlite3的用户(带有rails),直到现在我才有机会尝试使用mysql.我需要配置将它与Datamapper一起使用.在本教程之后,我需要使用以下命令安装dm-mysql-adapter:
sudo apt-get install libmysqlclient-dev
Run Code Online (Sandbox Code Playgroud)
我的.rb文件包含以下代码:
require 'data_mapper'
DataMapper.setup(:default, "mysql://user:password@hostname/database")
class Post
include DataMapper::Resource
property :id , Serial
property :title , String
property :body , Text
property :created_at , DateTime
end
Run Code Online (Sandbox Code Playgroud)
哪个没有运行,并给我以下错误:
in `require': no such file to load -- dm-mysql-adapter (LoadError)
Run Code Online (Sandbox Code Playgroud)
我相信,我需要设置用户名和密码才能启动并运行mysql,然后与Datamapper建立连接.有人可以指导我.
非常感谢!
我最近想写一个简单的迁移脚本.我写:
@entries = Entries.all(:text => /test/)
@entries.each do |entry|
entry.update(:text => entry.text.gsub!(/test/, "no-test"))
end
Run Code Online (Sandbox Code Playgroud)
它没有保存记录,即使update语句返回true.我错过了什么?
我是DataMapper的新手,我正在尝试为以下场景创建模型:
我有很多用户(用户名,密码等),也可以是玩家或裁判,或者两者兼而有(因此不能选择单表继承).基础模型将是:
class User
include DataMapper::Resource
property :id, Serial
# Other user properties go here
end
class Player
include DataMapper::Resource
property :id, Serial
# Other player properties go here
# Some kind of association goes here
end
class Referee
include DataMapper::Resource
property :id, Serial
# Other referee properties go here
# Some kind of association goes here
end
DataMapper.finalize
Run Code Online (Sandbox Code Playgroud)
不过,我不确定添加到播放器和裁判的关联类型.有了belongs_to :user,多个玩家可以与同一个用户相关联,这在我的上下文中没有意义.在RDBMS术语中,我想我想要的是对玩家和裁判员表中的外键的唯一约束.
我如何在DataMapper模型中完成此操作?我是否必须在验证中自行执行检查?
datamapper ×10
ruby ×6
activerecord ×2
migration ×2
php ×2
sinatra ×2
android ×1
database ×1
kotlin ×1
mysql ×1
oop ×1
performance ×1
slim-3 ×1
sql ×1
validation ×1