【问题标题】:Get latest from different relationship eloquent laravel从不同的关系中获取最新的雄辩 laravel
【发布时间】:2018-09-06 15:36:28
【问题描述】:

我有 3 张桌子

模型网址

class Url extends Model
{
    public function users(){
        return $this->belongsToMany(User::class);
    }
    public function url_status(){
        return $this->hasMany(UrlStatus::class);
    }
}

模型网址状态

class UrlStatus extends Model
{
    public function url()
    {
        return $this->belongsTo(Url::class);
    }
}

模型用户

class User extends Authenticatable
{
    use Notifiable, SoftDeletes, HasRoles;
    public function urls(){
        return $this->belongsToMany(Url::class);
    }
}

在我的控制器中我正在查询:

$url = Url::with('url_status','users')->where('list_status', true)->get();

如何获取最新的 url_status?

编辑---

这是迁移文件中每个表的结构

用于网址表

 Schema::create('urls', function (Blueprint $table) {
            $table->increments('id');
            $table->string('url');
            $table->string('description');
            $table->boolean('list_status');
            $table->timestamps();
        });

网址状态

Schema::create('url_status', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('url_id');
            $table->integer('status_code');
            $table->string('status');
            $table->boolean('sms');
            $table->boolean('email');
            $table->timestamps();
        });

用户表

Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('contacts');
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
            $table->softDeletes();
        });

【问题讨论】:

  • 你说的最新是什么意思?基于什么? iddate 或 ... ?
  • 按列创建日期
  • 首先查询多个Url 模型并附加每个模型的UrlStatus 并不能真正为您提供最新的UrlStatus 模型。使用latest 直接查询UrlStatus 并附加Url 可能更有意义。那,或者先运行join,然后通过url_status.created_at, DESC订购。

标签: php laravel laravel-5 eloquent


【解决方案1】:

你也可以这样试试

模型网址

public function latestUrlStatus(){
    return $this->hasOne(UrlStatus::class)->latest();
}

像这样获取它

$urls = Url::with('latestUrlStatus','users')->where('list_status', true)->get();
foreach($urls as $url){
    echo $url->latestUrlStatus->status_code;
}

【讨论】:

    【解决方案2】:

    尝试将latest() 方法与first() 一起使用:

    $url = Url::with('url_status','users')->where('list_status', true)->whereHas('url_status', function($q){
         $q->latest()->first();
    })->get();
    

    如果您尝试获取给定 URL 的最新 url_status,可以这样做:

    $url->url_status->latest()->first();
    

    【讨论】:

    • SQLSTATE[42S22]:找不到列:1054 'where 子句'中的未知列'urls.id'(SQL:select * from url_status where urls.id = @987654329 @.url_id order by created_at desc limit 1)
    • 你应该检查你的关系,因为url_status属于url,它肯定应该包含url_id字段
    • whereHas 用于查询关系是否存在,不影响预加载。
    • 我认为您需要每个 $url 的最新 URL 状态,如果需要,请检查我的更新 @Beginner
    猜你喜欢
    • 2018-08-14
    • 2020-12-02
    • 2019-07-16
    • 2021-08-09
    • 2015-03-14
    • 2018-11-28
    • 2015-01-11
    • 2021-06-03
    • 2020-03-26
    相关资源
    最近更新 更多