如何在Laravel中通过另一种模型设置雄辩的关系属于?

用户名

我有一个模型清单,该清单通过它的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');
}

我能够在视图中回显$ listing-> model-> name,但不能回显$ listing-> manufacturer-> name。这引发了错误。我尝试在Listing模型中注释掉两行只是为了获得效果,所以我可以回显$ listing-> manufacturer(),这行得通,但是不能正确建立它们之间的关系。我该怎么做呢?谢谢。

修改后的列表模型(感谢回答者):

    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');
    }
洛根·贝利(Logan Bailey)

我找到了解决方案,但这不是很简单。我已经在下面发布了它,但是我首先发布了我认为是更好的解决方案。

您不应直接从清单中访问制造商,因为制造商仅适用于模型。尽管您可以从清单对象中快速加载制造商关系,但请参见下文。

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');

现在,我们已经模拟了模型之间的关系,这真是太好了,我还真没想到。但是至少现在,我可以加入到Manufacturers表中。所以我再次更新了关系:

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规范。这使关系达到:

返回$ this-> belongsTo('Model','model_id')-> join('manufacturers','manufacturers.id','=','models.manufacturer_id')-> select(DB :: raw('manufacturers 。*'));

并查询到

select manufacturers.* from `models` 
    inner join `manufacturers` on `manufacturers`.`id` = `models`.`manufacturer_id`
    where `models`.`id` in (?)

现在我们有一个100%有效的查询,但是从关系中返回的对象的类型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。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Laravel 5.2中如何在一种方法中设置会话并在另一种方法中获取会话数据

来自分类Dev

如何在gradle中设置对另一种口味的依赖

来自分类Dev

如何在下面的属性中设置另一种颜色?

来自分类Dev

Rails:从一种模型到另一种模型的两种关系(别名)

来自分类Dev

如何通过另一种方法从数组中打印特定点?#Java

来自分类Dev

如何在Java(android)中的另一种方法中使用一种方法的变量

来自分类Dev

如何在 MS Access 中反映/复制从一种形式到另一种形式的更改

来自分类Dev

Rails:一种以多对多关系从另一种模型收集数据的有效方法

来自分类Dev

骨干:设置服务器从一种模型到另一种模型的响应

来自分类Dev

如何在Yii中呈现另一种类视图的形式?

来自分类Dev

如何在Codeigniter中以当前形式添加另一种形式?

来自分类Dev

稍后如何在另一种方法中利用用户输入

来自分类Dev

如何在我的应用程序中添加另一种语言?

来自分类Dev

在一种控制器方法中设置的模型属性的属性在另一种控制器方法中不可用

来自分类Dev

如何在 Ada 中将类型从一种更改为另一种?

来自分类Dev

如何使用另一种样式中的一种样式的价值?

来自分类Dev

如何使用另一种样式中的一种样式的价值?

来自分类Dev

PHP文件只能在一种设置中工作,而不能在另一种设置中

来自分类Dev

在Spring Boot应用程序中如何使用模型数据从一种控制器方法重定向到另一种方法

来自分类Dev

C ++:我在一种方法中得到一个迭代器,如何在另一种方法中通过迭代器修改原始列表?

来自分类Dev

Laravel如何在同一控制器中将发布数据从一种发布方法传递到另一种发布方法?

来自分类Dev

Laravel如何在同一控制器中将发布数据从一种发布方法传递到另一种发布方法?

来自分类Dev

将值从一种模型传递到另一种模型的形式

来自分类Dev

如何在Python中与其他字符一起使用另一种语言?

来自分类Dev

如何通过按一种形式的按钮创建对象并传递给另一种对象?

来自分类Dev

从另一种方法检索到的一种方法中设置的属性返回null

来自分类Dev

在一个按钮 onclick() 函数中设置另一种按钮背景颜色

来自分类Dev

将值设置为另一种形式

来自分类Dev

设置OnScrollListener的另一种方法

Related 相关文章

  1. 1

    在Laravel 5.2中如何在一种方法中设置会话并在另一种方法中获取会话数据

  2. 2

    如何在gradle中设置对另一种口味的依赖

  3. 3

    如何在下面的属性中设置另一种颜色?

  4. 4

    Rails:从一种模型到另一种模型的两种关系(别名)

  5. 5

    如何通过另一种方法从数组中打印特定点?#Java

  6. 6

    如何在Java(android)中的另一种方法中使用一种方法的变量

  7. 7

    如何在 MS Access 中反映/复制从一种形式到另一种形式的更改

  8. 8

    Rails:一种以多对多关系从另一种模型收集数据的有效方法

  9. 9

    骨干:设置服务器从一种模型到另一种模型的响应

  10. 10

    如何在Yii中呈现另一种类视图的形式?

  11. 11

    如何在Codeigniter中以当前形式添加另一种形式?

  12. 12

    稍后如何在另一种方法中利用用户输入

  13. 13

    如何在我的应用程序中添加另一种语言?

  14. 14

    在一种控制器方法中设置的模型属性的属性在另一种控制器方法中不可用

  15. 15

    如何在 Ada 中将类型从一种更改为另一种?

  16. 16

    如何使用另一种样式中的一种样式的价值?

  17. 17

    如何使用另一种样式中的一种样式的价值?

  18. 18

    PHP文件只能在一种设置中工作,而不能在另一种设置中

  19. 19

    在Spring Boot应用程序中如何使用模型数据从一种控制器方法重定向到另一种方法

  20. 20

    C ++:我在一种方法中得到一个迭代器,如何在另一种方法中通过迭代器修改原始列表?

  21. 21

    Laravel如何在同一控制器中将发布数据从一种发布方法传递到另一种发布方法?

  22. 22

    Laravel如何在同一控制器中将发布数据从一种发布方法传递到另一种发布方法?

  23. 23

    将值从一种模型传递到另一种模型的形式

  24. 24

    如何在Python中与其他字符一起使用另一种语言?

  25. 25

    如何通过按一种形式的按钮创建对象并传递给另一种对象?

  26. 26

    从另一种方法检索到的一种方法中设置的属性返回null

  27. 27

    在一个按钮 onclick() 函数中设置另一种按钮背景颜色

  28. 28

    将值设置为另一种形式

  29. 29

    设置OnScrollListener的另一种方法

热门标签

归档