【问题标题】:Laravel - Define relationship with string like xyz instead of using idLaravel - 用 xyz 之类的字符串定义关系而不是使用 id
【发布时间】:2020-02-15 17:14:42
【问题描述】:

我有一个存储有关事件信息的表。该事件具有位置属性(字符串)。现在我有一个表 locations 表,其中存储了位置名称及其地址。

现在我想从数据库中获取所有事件及其位置。

因为我从外部来源获取所有事件,所以我不能使用 id 来建立关系。

所以我需要的是一种类似于$this->hasOne('Location')->where('name','LIKE','%location_name%');的关系

这样的事情可能吗?如果没有,实现这样的最佳实践是什么,所以我得到这样的输出 JSON:

 {
    "name":"Event Abc",
    "date":"2019-10-18 12:00:00",
    "location":"Location X",
    "location_details": {
        "name":"Location X",
        "address":"Street XYZ"
    }
 }

谢谢

【问题讨论】:

  • 您可以改为在 name 列上进行连接,但我认为您不能将其与 like 运算符一起使用。在 Laravel 中,您可以使用 $this->hasOne('Location', 'name', 'location');(可能不太正确,但第二和第三个参数是您指定连接列的方式)
  • @TimLewis - $this->hasOne('Location', 'name', 'location');,工作 - 但 LIKE 会更好
  • 对,但这不是joins 在 SQL 中的工作方式。 hasOne()(以及其他关系方法,belongsTo() 等)构造了用于链接两个表的连接逻辑,因此列值需要完全匹配。同样,varchar 列(字符串)可以在joins 中使用,但不能用于通配符检查。

标签: laravel eloquent relationship


【解决方案1】:

是的,这是可能的。但是你需要很少的修改。所以让我们试着让我知道发生了什么

function location () {
       return $this->hasOne('App\Location')->where('name','LIKE','%location_name%')->get();
    }

然后从你的控制器调用它

    $eventsWithlocation = Event::with('location')->first();
      dd($eventsWithlocation);

【讨论】:

  • ErrorException: Array to string conversion ... 所以它不起作用!
  • 对不起,会有一个 first() 而不是 get()。我编辑了我的答案,你可以试试这个
  • 该编辑不会对您的代码产生任何影响...dd() 处理 Collection->get() 的结果)和 Event 实例(->first() 的结果)就好了
  • 那么他为什么会出现这个错误,你能帮我吗,因为他有一对一的关系。这就是为什么在模型中我使用 first()。所以,我认为在控制器中应该有 first() 因为他得到了数组到字符串的错误
  • 可能有不同的代码会导致他们没有费心显示的错误,但在您的示例中,->get()->first() 没有区别; dd($eventsWithlocation); 可以同时使用。
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2016-07-15
  • 2014-12-09
  • 1970-01-01
相关资源
最近更新 更多