laravel雄辩-如何选择用户

时间:2018-06-29 13:42:00

标签: laravel eloquent

我有两个桌子:

具有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",

1 个答案:

答案 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);
}