<tfoot id='ub6oy'></tfoot>
  • <small id='ub6oy'></small><noframes id='ub6oy'>

    <legend id='ub6oy'><style id='ub6oy'><dir id='ub6oy'><q id='ub6oy'></q></dir></style></legend>

    <i id='ub6oy'><tr id='ub6oy'><dt id='ub6oy'><q id='ub6oy'><span id='ub6oy'><b id='ub6oy'><form id='ub6oy'><ins id='ub6oy'></ins><ul id='ub6oy'></ul><sub id='ub6oy'></sub></form><legend id='ub6oy'></legend><bdo id='ub6oy'><pre id='ub6oy'><center id='ub6oy'></center></pre></bdo></b><th id='ub6oy'></th></span></q></dt></tr></i><div id='ub6oy'><tfoot id='ub6oy'></tfoot><dl id='ub6oy'><fieldset id='ub6oy'></fieldset></dl></div>
          <bdo id='ub6oy'></bdo><ul id='ub6oy'></ul>

      1. 如何在 Laravel 中设置 Eloquent 关系属于通过另一个

        时间:2023-09-24
        1. <legend id='gsWNg'><style id='gsWNg'><dir id='gsWNg'><q id='gsWNg'></q></dir></style></legend>

          <small id='gsWNg'></small><noframes id='gsWNg'>

            • <bdo id='gsWNg'></bdo><ul id='gsWNg'></ul>
                <tbody id='gsWNg'></tbody>
                <i id='gsWNg'><tr id='gsWNg'><dt id='gsWNg'><q id='gsWNg'><span id='gsWNg'><b id='gsWNg'><form id='gsWNg'><ins id='gsWNg'></ins><ul id='gsWNg'></ul><sub id='gsWNg'></sub></form><legend id='gsWNg'></legend><bdo id='gsWNg'><pre id='gsWNg'><center id='gsWNg'></center></pre></bdo></b><th id='gsWNg'></th></span></q></dt></tr></i><div id='gsWNg'><tfoot id='gsWNg'></tfoot><dl id='gsWNg'><fieldset id='gsWNg'></fieldset></dl></div>

                  <tfoot id='gsWNg'></tfoot>
                  本文介绍了如何在 Laravel 中设置 Eloquent 关系属于通过另一个模型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我有一个模型列表,它通过它的belongsTo('Model') 关系继承应该本质上属于其对应模型所属的制造商.

                  I have a model Listing that inherits through its belongsTo('Model') relationship should inherently belong to the Manufacturer that its corresponding Model belongs to.

                  这是我的列表模型:

                      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 模型中注释掉 2 行只是为了获得效果,然后我可以 echo $listing->manufacturer() 并且这会起作用,但这并不能正确建立它们的关系.我该怎么做呢?谢谢.

                  I am able to echo $listing->model->name in a view, but not $listing->manufacturer->name. That throws an error. I tried the commented out 2 lines in the Listing model just to get the effect so then I could echo $listing->manufacturer() and that would work, but that doesn't properly establish their relationship. How do I do this? Thanks.

                  修订列表模型(感谢回答者):

                  Revised Listing model (thanks to answerer):

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

                  推荐答案

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

                  I found a solution, but it's not extremely straight forward. I've posted it below, but I posted what I think is the better solution first.

                  您不应该直接从列表中访问制造商,因为制造商仅适用于模型.虽然您可以从列表对象中预先加载制造商关系,但请参见下文.

                  You shouldn't be able to access manufacturer directly from the listing, since manufacturer applies to the Model only. Though you can eager-load the manufacturer relationships from the listing object, see below.

                  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;
                  }
                  

                  为了让您要求的解决方案发挥作用,我们费了一番周折.解决方案如下:

                  It took a bit of finagling, to get your requested solution working. The solution looks like this:

                  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.*'));
                  }
                  

                  我首先处理查询并从中构建响应.我希望创建的查询类似于:

                  I started off by working with the query and building the response from that. The query I was looking to create was something along the lines of:

                  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,并且您永远不会返回制造商.

                  The ? would be replaced by the value of manufacturer_id columns from the listings table. This column doesn't exist, so a single 0 would be inserted and you'd never return a manufacturer.

                  在我想重新创建的查询中,我受到了models.id 的约束.通过定义外键,我可以在我的关系中轻松访问该值.于是关系变成了

                  In the query I wanted to recreate I was constraining by models.id. I could easily access that value in my relationship by defining the foreign key. So the relationship became

                  return $this->belongsTo('Manufacturer', 'model_id');
                  

                  这会产生与之前相同的查询,但会使用 model_ids 填充 ?.所以这会返回结果,但通常是不正确的结果.然后我打算更改我从中选择的基表.这个值是从模型派生出来的,所以我把传入的模型改成了Model.

                  This produces the same query as it did before, but populates the ? with the model_ids. So this returns results, but generally incorrect results. Then I aimed to change the base table that I was selecting from. This value is derived from the model, so I changed the passed in model to Model.

                  return $this->belongsTo('Model', 'model_id');
                  

                  我们现在已经模拟了模型关系,太好了,我真的什么都没有.但至少现在,我可以连接到制造商表.所以我再次更新了关系:

                  We've now mimic the model relationship, so that's great I hadn't really got anywhere. But at least now, I could make the join to the manufacturers table. So again I updated the relationship:

                  return $this->belongsTo('Model', 'model_id')
                      ->join('manufacturers', 'manufacturers.id', '=', 'models.manufacturer_id');
                  

                  这让我们更近了一步,生成了以下查询:

                  This got us one step closer, generating the following query:

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

                  从这里开始,我想将查询的列限制为制造商列,为此我添加了选择规范.这使关系变为:

                  From here, I wanted to limit the columns I was querying for to just the manufacturer columns, to do this I added the select specification. This brought the relationship to:

                  返回 $this->belongsTo('Model', 'model_id')->加入('制造商','manufacturers.id','=','models.manufacturer_id')->select(DB::raw('manufacturers.*'));

                  return $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,但希望它受到 where 子句中的models表的约束.我创建了一个新的制造商实例并将表设置为models`并手动创建关系.

                  Now we have a 100% valid query, but the objects being returned from the relationship are of type Model not Manufacturer. And that's where the last bit of trickery came in. I needed to return a Manufacturer, but wanted it to constrain by themodelstable in the where clause. I created a new instance of Manufacturer and set the table tomodels` and manually create the relationship.

                  需要注意的是,保存将不起作用.

                  $listing = Listing::find(1);
                  $listing->manufacturer()->associate(Manufacturer::create([]));
                  $listing->save();
                  

                  这将创建一个新的制造商,然后将 listings.model_id 更新为新制造商的 ID.

                  This will create a new Manufacturer and then update listings.model_id to the new manufacturer's id.

                  这篇关于如何在 Laravel 中设置 Eloquent 关系属于通过另一个模型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:Eloquent - Eager 加载关系 下一篇:Laravel 不允许我迁移表,因为它已经存在

                  相关文章

                  最新文章

                  • <bdo id='Hp0fO'></bdo><ul id='Hp0fO'></ul>
                  <i id='Hp0fO'><tr id='Hp0fO'><dt id='Hp0fO'><q id='Hp0fO'><span id='Hp0fO'><b id='Hp0fO'><form id='Hp0fO'><ins id='Hp0fO'></ins><ul id='Hp0fO'></ul><sub id='Hp0fO'></sub></form><legend id='Hp0fO'></legend><bdo id='Hp0fO'><pre id='Hp0fO'><center id='Hp0fO'></center></pre></bdo></b><th id='Hp0fO'></th></span></q></dt></tr></i><div id='Hp0fO'><tfoot id='Hp0fO'></tfoot><dl id='Hp0fO'><fieldset id='Hp0fO'></fieldset></dl></div>
                  <legend id='Hp0fO'><style id='Hp0fO'><dir id='Hp0fO'><q id='Hp0fO'></q></dir></style></legend>

                    <small id='Hp0fO'></small><noframes id='Hp0fO'>

                  1. <tfoot id='Hp0fO'></tfoot>