laravel中的默认外键,用于指向错误的关系

时间:2017-03-20 13:31:26

标签: laravel laravel-5

Laravel要求 users_id而不是user_id 我有两个表用户(id,name,email ..)和Country(id, user_id ,country ..)。

用户模型

{% extends "base.html" %}

<script>

{% block jquery %}

function setPrice(){
    var price = $(".variation_select option:selected").attr("data-price")

    var sale_price = $(".variation_select option:selected").attr("data-sale-price")
    if (sale_price != "" && sale_price != "None" && sale_price != null ) {
    $("#price").html("<h4>" + sale_price + " <small class='og-price'>" + price + "</small></h4>");
    } else {
    $("#price").html(price);
    }

}
setPrice()

$(".variation_select").change(function(){
    setPrice()

})


{% endblock %}  

</script>


{% block content %}




<div class="row">
{% for object in object_list %}
  <div class="col-sm-6 col-md-4">
    {% if object.productimage_set.count > 0 %}

    {% for img in object.productimage_set.all %}
    <div class="thumbnail">
      <img class='img-responsive' src="{{ img.image.url }}" >


    {% endfor %} 

    {% endif %}



      <div class="caption">
        <h3>{{ object.title }}</h3>

        <form id='add-form' method='GET' action="{% url 'cart' %}">
        <p id='jquery-message' class='lead'></p>

        {% if object.variation_set.count > 1 %}
        <h4 id='price'>{{ object.variation_set.first.price }}</h4>

        <select name= 'item' class='form-control variation_select'>
                {% for vari_obj in object.variation_set.all %}
                    <option data-sale-price="{{vari_obj.sale_price}}" data-price="{{ vari_obj.price }}" value="{{ vari_obj.id }}">{{ vari_obj }}</option>
                {% endfor %}
                </select>


        {% else %}
                <input type="hidden" name='item' value='{{ object.variation_set.first.id }}' />
                    <h4 id="price">{% if object.variation_set.first.sale_price %}

                    {{ object.variation_set.first.sale_price }}
                    <small class="og-price">{{ object.variation_set.first.price }}</small>

                    {% else %}

                    {{ object.variation_set.first.price }}

                    {% endif %}

                </h4>




        {% endif %}

        <p>{{object.description}}</p>
        <input class='form-control' type='number' name='qty' value='1' /> 
        <br></br>
        <p><input id='submit-btn' type='submit'  value='Add to Cart' class="btn btn-primary" />


        </p>
        </form>

      </div>
    </div>
  </div>
  {% endfor %}
</div>

{% endblock %}

国家模式

public function countries(){
   return $this->hasOne('App\User');
}

控制器

public function users(){
   return $this->belongsTo('App\User');
}

错误

$user = $user = User::find(1);
$country = new Country();
$country->country = 'TN';
$country->users()->associate($user);
$country->save();

我很困惑,我不知道我是对还是错。有人可以解释一下为什么要求用户 s _id。

3 个答案:

答案 0 :(得分:0)

将关系名称更改为user()

public function user()
{
    return $this->belongsTo('App\User');
}

答案 1 :(得分:0)

我认为这是一个概念问题。如果这是正常情况并且您尝试添加用户,则每个用户都有一个国家/地区,并且您希望具有反向关系,以便您可以列出某个国家/地区的所有用户。

如果是这样,你需要在country_id表中添加外键users而不是在countries表中添加users_id,因此关系应定义如下:

public function country(){
   return $this->belongsTo('App\Country');
}

并在国家/地区模型中

public function users(){
   return $this->hasMany('App\User');
}

考虑关系的基本角色是:

乡村的hasMany-用户

用户hasOne国

所以关系应该是one-to-many,因此必须有一个外键(在我们的例子中是国家)在许多表中(这里的用户表)。

答案 2 :(得分:0)

我遇到了同样的问题,对我来说似乎是个错误。

我有一个带有“ user_id”字段的表“ company”。

这两个成员函数返回不同的结果:

public function owner()               { return $this->belongsTo('App\User'); } 
public function user()                { return $this->belongsTo('App\User'); }

为了使其正常工作,我需要指定第二个参数。这对我来说是非常违反直觉的。

public function owner()               { return $this->belongsTo('App\User', 'user_id'); }
public function user()                { return $this->belongsTo('App\User'); }

显然,这是预期的行为,因为'belongsTo'方法使用父函数的名称来确定键。在我看来,这很疯狂,我希望模型名称能够确定密钥。

https://github.com/laravel/framework/issues/18804