我正在开发一个应用程序,它将用作其他应用程序的可扩展框架.
其中一个基本类称为Node,而Nodes具有Content.SQL表看起来像这样:
TABLE节点(NodeId int,....等)
TABLE NodeContentRelationship(NodeId int,ContentType string,ContentId int)
扩展应用程序的开发人员将创建自己的内容类型.
显然,从关系数据库的角度来看,这是不好的,因为无法向NodeContentRelationship.ContentId添加外键关系,即使它是外键列.
但是,解决方案非常简单和强大,所以我不愿意改变它.
你觉得怎么样 - 我是否在追寻一个痛苦的世界?
我一直在研究一些"落后"关系的模型.我开始想知道......如果我想过滤一些结果怎么办?
我有两个型号:
Model A:
name
image
date
Model B:
ForeignKey to Model A
name
date
Run Code Online (Sandbox Code Playgroud)
要访问模型AI,请使用:p = A.objects.all().order_by(' - date')
然后我把它传递给模板.
在模板中:
{% for n in model_a.all %}
{% for item in n.modelb_set.all %}
<li>{{item.name}}</li>
{% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我得到了模型A的所有后向相关对象,那很好.
现在如果我想从该查询中过滤一些结果怎么办?
我在考虑通过以下方式迭代:
p = A.objects.all().order_by('-date')
for n in p:
for x in n.modelb_set.filter(date_lte=""):
ls = []
ls.append[x]
Run Code Online (Sandbox Code Playgroud)
我如何将其传递给模板并获得我之前获得的(未过滤的视图)但现在已经过滤了结果?
我有两张桌子,
表用户:id,name等
表视频:id,user_id等
型号:视频
public function user()
{
return $this->belongsTo('App\Models\User');
}
Run Code Online (Sandbox Code Playgroud)
我想选择用户"Max"所拥有的所有视频.
我尝试过以下内容:
$Videos = \App\Models\Video::with('user')->where('user.name','=','Max')->get();
Unknown column 'user.name' in 'where clause' (SQL: select * from `videos` where `videos`.`deleted_at` is null and `user`.`name` = Max)
Run Code Online (Sandbox Code Playgroud)
谢谢!
嗨,我正在从事laravel培训项目。尝试获取每个产品类别名称时,模型和关系存在问题。
这是我的产品型号
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
public function category()
{
return $this->belongsTo('App\Category');
}
}
Run Code Online (Sandbox Code Playgroud)
和我的类别模型
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
protected $table = 'categories';
public function products()
{
return $this->hasMany('App\Product');
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试获取像这样的每个产品的类别名称时
@foreach($products as $product)
<tr>
<td>{{ $product->id }}</td>
<td>{{ $product->name }}</td>
<td>{{ $product->category->name }}</td>
</tr>
@endforeach
Run Code Online (Sandbox Code Playgroud)
当我运行页面时,出现此错误
Undefined property: stdClass::$category (View: /var/www/html/projectname/resources/views/my/products/index.blade.php)
Run Code Online (Sandbox Code Playgroud)
谁能告诉我是什么原因导致此错误?
这里更新的是表结构
Products:id,name,category_id-> unsigned()
Categories:id,name
,这是我用来获取$ products的代码
$user_id = Auth::user()->id;
$products = …Run Code Online (Sandbox Code Playgroud) 我已经知道,我可以在同一模型中实现ForeignKey父子关系,从而可以与1个parent =多个孩子创建关系。但是,如何在同一模型中完成多对多关系?此刻,我编写并测试了这一点:
class Person(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
parents = models.ManyToManyField(
'self', blank=True
)
Run Code Online (Sandbox Code Playgroud)
它可以工作,但不像我预期的那样。它的作用是:
john = Person.objects.get(id=1)
sam = Person.objects.get(id=2)
>>> john.parents.all()
<QuerySet [<Person: Alex>, <Person: Peter>, <Person: Sam>]>
>>> sam.parents.all()
<QuerySet [<Person: John>]>
Run Code Online (Sandbox Code Playgroud)
如您所见,Sam应该是John的孩子,而不是他的孩子和父母。我想要的是在检索sam.parents.all()时得到约翰,但不是在检索john.parents.all()时得到山姆。
有没有办法实现我想要的?还是至少不能使用这种逻辑?我是否必须使用同一应用程序创建第二个单独的模型?
假设我有三个与外键链接的数据库,即玩家,信用和照片。
player
id | name | address
credit
id | player_id | credit_status
photo
id | player_id
Run Code Online (Sandbox Code Playgroud)
假设我想获得所有具有credit_status $ status的玩家,我会这样做:
$status = 'bar';
Player::with('photo','credit')->whereHas('credit', function ($q) use ($status) {
$q->where('credit_status', $status)->with('credit_status');
})->paginate(15);
Run Code Online (Sandbox Code Playgroud)
这将列出所有具有credit_status $ credit的玩家,但仍然列出该玩家的所有积分,而不管其状态如何。
输出类似于:
{
id: 1
name: Andrew
address: home
photo: {
id: 2
photo: image1
}
credit: {
[
{
id: 6
credit_status: foo,
id: 2
credit_status: bar
}
]
}
},
{
id: 2
name: Mark
address: home
photo: {
id: 5
photo: image4
} …Run Code Online (Sandbox Code Playgroud) 我一直在NET和SO中寻找一些答案 - 我对实体框架几乎是一个菜鸟..所以我对相关实体确实有一些困惑..我正在使用 C# , Winforms , Linq , EF6^ (生成的反向数据库类在 DAL 项目中)
我很难解决这个问题。我有 3 个表,它们与第四个表相关 - 第 4 个表使用其他 3 个表中的 PK_ID 列 - 配置为外键,它们还组成了复合键(主键)。
我的粗略 ER 图。
我需要在 EF 查询中做的是获取多个列以将数据绑定绑定到列表视图。
我想要的列是 EnumerationCode、Part.Number、Part.Description。
我将使用 ProdID (我将 Products 绑定到 DropDown )作为这些附加值的 getter。
所以基本上我想到了这一点 Select From TernaryTable T Join EnumID on ENumTable.EnumID where T.ProdID = myProdID order by EnumCode [Join this to Select Part.Number, Part.Description From PartID = TernaryTable.PartID )
我认为可能有一个简单的解决方案来获取这些数据,然后如何保存对数据的任何更改 - 但正如我所说,我迷失了。
我需要两种方法,一种是获取数据,另一种是保存数据发生的任何更改。
我读过这个
backref有没有办法从 SqlAlchemy 中的关系中检索元素子集,但保持创建类时我在(关系)中定义的顺序?
假设我有两个表/模型: AUser和 a UserLog,其中包含用户执行的操作(只是Basedeclarative_base ())
每个日志UserLog都有一个执行操作的 ID 的外键User,并且每个日志的操作类型可以从Enum. 每个用户日志还有一个created我订购的时间戳:在常规情况下,我希望从最旧到最新(最旧的在前)获取日志。
但是,我还希望能够让特定用户仅加载日志的子集(特定操作的日志)。我知道这违背了连接负载的“要点”,因为我会得到不切实际的数据库状态(有更多日志链接到我获取的对象User将反映的用户),但在某些情况下它会很有帮助。
class UserLog(Base):
__tablename__ = 'user_logs'
id = Column(UUID(as_uuid=True), primary_key=True)
timestamp_created = Column(
DateTime, server_default=sqlalchemy.text("now()")
)
user_id = Column(
UUID(as_uuid=True),
ForeignKey("users.id", ondelete="CASCADE")
)
action = Column(SaEnum(UserLogsConstants), nullable=False)
user = relationship(
"User",
backref=backref(
'logs', order_by="asc(UserLog.timestamp_created)"
) # The order_by is important here
)
Run Code Online (Sandbox Code Playgroud)
感谢这个 SO 答案,我已经能够使用 加载日志子集contains_eager,但随后我丢失了timestamp_created …
我想将资源字段的默认值设置为经过身份验证的用户的id. 我有一个名为 的模型,它与和Note具有一对多关系。GameUser
User hasMany Note
Game hasMany Note
Note belongsTo User
Note belongsTo Game
Run Code Online (Sandbox Code Playgroud)
在 Laravel Nova 中,我的注释字段如下所示
ID::make()->sortable(),
Text::make('Note', 'note')->onlyOnIndex(),
Textarea::make('Note', 'note')->alwaysShow(),
BelongsTo::make('Game', 'game')->hideWhenCreating()->hideWhenUpdating(),
BelongsTo::make('Created By', 'user', 'App\Nova\User')->hideWhenCreating()->hideWhenUpdating(),
DateTime::make('Created At', 'created_at')->hideWhenCreating(),
DateTime::make('Updated At', 'updated_at')->hideWhenCreating(),
Run Code Online (Sandbox Code Playgroud)
因为我引用Nova 资源Note上的Game,所以当我创建 时Note,该game_id列已正确填充。但是,我希望该user_id列是经过身份验证的用户的值。它似乎不是这样工作的,我该如何实现呢?
我有一对一的多态,我想找出更新现有关系的最佳方式。
class Image extends Model
{
/**
* Get the owning imageable model.
*/
public function imageable()
{
return $this->morphTo();
}
}
class Post extends Model
{
/**
* Get the post's image.
*/
public function image()
{
return $this->morphOne('App\Image', 'imageable');
}
}
class User extends Model
{
/**
* Get the user's image.
*/
public function image()
{
return $this->morphOne('App\Image', 'imageable');
}
}
Run Code Online (Sandbox Code Playgroud)
PostController 中的更新方法
public function update(Request $request, $id)
{
$post = Post::findOrFail($id);
$post->image()->delete();
$post->image()->save(new Image([
'url'=> $request->input('image_url), …Run Code Online (Sandbox Code Playgroud) relationship ×10
laravel ×5
django ×2
eloquent ×2
python ×2
c# ×1
categories ×1
database ×1
filter ×1
foreign-keys ×1
laravel-nova ×1
linq ×1
loading ×1
models ×1
one-to-one ×1
polymorphism ×1
sql ×1
sqlalchemy ×1
stdclass ×1
winforms ×1