我有两个桌子:
具有ID的用户表 并以用户ID为“发件人”的Messages表和以offer_id为要约的ID
我想选择所有发送带有特定offer_id消息的用户
例如 ID为1的用户发送的消息很少:
Id from offer_id
1. 1, 5
2. 2, 5
3. 1, 5
4. 1, 3
我要选择所有发送offer_id = 5的用户,因此ID为1和2的用户
如何通过雄辩的Message和User类做到这一点? 我已经提供了offer_id,因此我可以轻松选择消息:
$messages = Message::where('offer_id', $id);
但是如何选择用户?
编辑: 我这样尝试: 在消息模型中:
public function fromContact()
{
return $this->hasOne(User::class, 'id', 'from');
}
然后在控制器中:
$contacts = $messages->fromContact;
但是它给出了一个错误
编辑迁移:
Schema::create('messages', function (Blueprint $table) {
$table->increments('id');
$table->integer('from')->unsigned();
$table->integer('to')->unsigned();
$table->boolean('read')->default(false);
$table->integer('offer_id')->nullable();
$table->mediumText('body')->nullable();
$table->timestamps();
});
和错误:
"message": "Undefined property:
Illuminate\\Database\\Eloquent\\Builder::$fromContact",
答案 0 :(得分:3)
您缺少查询生成器的某些关闭功能。使用时
$messages = Message::where('offer_id', $id);
在使用闭包(Message
,->first()
等之前,您没有->get()
的实例。因此,使用
$message->fromContact;
将导致错误,指出->fromContact
实例上Builder
不可用。为此,请使用
$messages = Message::where('offer_id', $id)->get();
foreach($messages AS $message){
$contacts = $message->fromContact;
}
由于这在循环中没有太多上下文,因此上面的代码没有任何作用,但是$messages->fromContact
也将是一个错误。要解决此问题,请使用:
$message = Message::where('offer_id', $id)->first();
$contacts = $message->fromContact;
这应该使您对发生的问题及其处理方法有了个很好的了解。
修改
遍历多个Message
实例时,将$message->fromContact
推入数组(或Collection
)以备后用:
$messages = Message::with(['fromContact'])->where('offer_id', $id)->get();
// Note: Using `::with()` prevents additional database calls when using `$message->fromContact` in a loop.
$contacts = []; // or $contacts = collect([]);
foreach($messages AS $message){
$contacts[] = $message->fromContact; // or $contacts->push($message->fromContact);
}