作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个模型列表,它通过它的belongsTo('Model') 关系继承应该本质上属于其对应模型所属的制造商。
这是来自我的列表模型:
public function model()
{
return $this->belongsTo('Model', 'model_id');
}
public function manufacturer()
{
return $this->belongsTo('Manufacturer', 'models.manufacturer_id');
/*
$manufacturer_id = $this->model->manufacturer_id;
return Manufacturer::find($manufacturer_id)->name;*/
}
public function listings()
{
return $this->hasManyThrough('Listing', 'Model', 'manufacturer_id', 'model_id');
}
public function models()
{
return $this->hasMany('Model', 'manufacturer_id');
}
public function model()
{
return $this->belongsTo('Model', 'model_id');
}
public function manufacturer()
{
return $this->belongsTo('Model', 'model_id')
->join('manufacturers', 'manufacturers.id', '=', 'models.manufacturer_id');
}
最佳答案
我找到了一个解决方案,但它不是非常简单。我已经在下面发布了它,但我首先发布了我认为更好的解决方案。
您不应该能够直接从列表中访问制造商,因为制造商仅适用于模型。尽管您可以从列表对象中预先加载制造商关系,但请参见下文。
class Listing extends Eloquent
{
public function model()
{
return $this->belongsTo('Model', 'model_id');
}
}
class Model extends Eloquent
{
public function manufacturer()
{
return $this->belongsTo('manufacturer');
}
}
class Manufacturer extends Eloquent
{
}
$listings = Listing::with('model.manufacturer')->all();
foreach($listings as $listing) {
echo $listing->model->name . ' by ' . $listing->model->manufacturer->name;
}
public function manufacturer()
{
$instance = new Manufacturer();
$instance->setTable('models');
$query = $instance->newQuery();
return (new BelongsTo($query, $this, 'model_id', $instance->getKeyName(), 'manufacturer'))
->join('manufacturers', 'manufacturers.id', '=', 'models.manufacturer_id')
->select(DB::raw('manufacturers.*'));
}
SELECT * FROM manufacturers ma
JOIN models m on m.manufacturer_id = ma.id
WHERE m.id in (?)
return $this->belongsTo('Manufacturer');
创建的查询
select * from `manufacturers` where `manufacturers`.`id` in (?)
?
将替换为
manufacturer_id
的值列表中的列。此列不存在,因此将插入单个 0,并且您永远不会返回制造商。
models.id
的约束。 .通过定义外键,我可以在我的关系中轻松访问该值。于是关系变成了
return $this->belongsTo('Manufacturer', 'model_id');
?
与model_ids。所以这会返回结果,但通常是不正确的结果。然后我打算更改我从中选择的基表。这个值是从模型派生出来的,所以我把传入的模型改成了
Model
.
return $this->belongsTo('Model', 'model_id');
return $this->belongsTo('Model', 'model_id')
->join('manufacturers', 'manufacturers.id', '=', 'models.manufacturer_id');
select * from `models`
inner join `manufacturers` on `manufacturers`.`id` = `models`.`manufacturer_id`
where `models`.`id` in (?)
select manufacturers.* from `models`
inner join `manufacturers` on `manufacturers`.`id` = `models`.`manufacturer_id`
where `models`.`id` in (?)
Model
不是
Manufacturer
.这就是最后一点诡计出现的地方。我需要返回一个
Manufacturer, but wanted it to constrain by the
型号
table in the where clause. I created a new instance of Manufacturer and set the table to
模型`并手动创建关系。
$listing = Listing::find(1);
$listing->manufacturer()->associate(Manufacturer::create([]));
$listing->save();
listings.model_id
到新制造商的 ID。
关于php - 如何在 Laravel 中设置 Eloquent 关系属于通过另一个模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26327965/
我是一名优秀的程序员,十分优秀!