Laravel Scout tìm kiếm với mối quan hệ

Nếu bạn quan tâm, tôi đang làm việc trên một cái gì đó tương tự. Tôi cũng cần tìm kiếm trong các mô hình có liên quan, vì vậy tôi đang kết hợp dự án Eloquent-joins [có thể thực hiện tham gia thực sự vào mô hình hùng hồn thay vì hệ thống tải háo hức được sử dụng bởi Laravel] với trình điều khiển trinh sát mysql

Cách duy nhất để tìm kiếm trong một mô hình có liên quan là thực hiện một vị trí trên bảng đã nối, sử dụng tên trường đầy đủ [ví dụ:. original_users. tên người dùng]. Tôi đã phải viết lại trình điều khiển mysql trinh sát để tìm kiếm các trường sẽ được sử dụng ngay cả trong mô hình liên quan đã chỉ định và sử dụng hệ thống tham gia trong quá trình truy vấn [và chức năng khác mà tôi cần trong dự án của mình]

Đối với dự án eloquent-joins, tôi đã tạo một nhánh rẽ mà tôi đang cập nhật để hoạt động với Laravel 6 và hệ thống trình điều khiển mới của anh ấy. https. //github. com/mix359/eloquent-joins/tree/dev

Nếu có ai đó quan tâm và tôi có chút thời gian, tôi có thể thử tạo một gói với trình điều khiển được viết lại [cấu trúc khác với gói ban đầu vì nó không được phát triển với ý tưởng xuất bản trong một gói]

Scout Extended biến đổi mô hình của bạn thành các bản ghi Algolia bằng phương pháp

class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}
8. Bạn có thể ghi đè phương thức này để tùy chỉnh dữ liệu nào bạn muốn lập chỉ mục

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}

Để biết thêm về phương pháp

class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}
9, hãy kiểm tra phần

Các mối quan hệ

Algolia không thực hiện bất kỳ hoạt động

1
2
3
4
5
6
7
8
9
10
11
0 nào. Tất cả dữ liệu có thể tìm kiếm phải tồn tại trong mỗi bản ghi. Điều này có nghĩa là các mối quan hệ mô hình không được lập chỉ mục theo mặc định. Nếu bạn muốn lập chỉ mục các mối quan hệ trong một bản ghi, bạn cần ghi đè phương thức
class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}
8 trong mô hình của mình và bao gồm các mối quan hệ bạn muốn lập chỉ mục

Thêm thuộc tính từ quan hệ

Ví dụ: nếu bạn đang lập chỉ mục các bài viết và mỗi bài viết có một tác giả, tất cả những gì bạn cần làm là thêm tên đầy đủ hoặc email của bài viết đó

1
2
3
4
5
6
7
8
9
10
11
public function toSearchableArray[]
{
    $array = $this->toArray[];

    $array = $this->transform[$array];

    $array['author_name'] = $this->author->name;
    $array['author_email'] = $this->author->email;

    return $array;
}

Nhiều nhiều

Nếu bạn muốn lập chỉ mục toàn bộ mối quan hệ, bạn có thể thực hiện bằng cách tải chúng trước khi gọi phương thức

1
2
3
4
5
6
7
8
9
10
11
2

Đối tượng kết quả có các danh mục, được Laravel chuyển đổi thành một mảng

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
0

Có thể là không phải tất cả dữ liệu từ mối quan hệ. Để xóa dữ liệu, bạn có thể làm một cái gì đó như thế này

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2

Hãy nhớ rằng Algolia có giới hạn kích thước cho mỗi bản ghi, vì vậy bạn chỉ nên lập chỉ mục cho dữ liệu mình cần

Cập nhật quan hệ khi cha/con thay đổi

Khi bạn nhúng thông tin từ một mối quan hệ vào hồ sơ của mình, bạn có thể muốn cập nhật chúng khi bạn thay đổi mối quan hệ

Tùy thuộc vào loại mối quan hệ giữa các mô hình của bạn, bạn có hai giải pháp. sử dụng thuộc tính

1
2
3
4
5
6
7
8
9
10
11
3 và lắng nghe sự kiện
1
2
3
4
5
6
7
8
9
10
11
4

Sử dụng thuộc tính
1
2
3
4
5
6
7
8
9
10
11
3

Laravel phải cho mối quan hệ cha mẹ biết rằng một trong những đứa con của họ đã thay đổi

In a typical Article Comment example, all you would need to do is add

1
2
3
4
5
6
7
8
9
10
11
6 to the
1
2
3
4
5
6
7
8
9
10
11
3 property.

1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
9

Phương pháp này chỉ hoạt động với các mối quan hệ

1
2
3
4
5
6
7
8
9
10
11
8 và
1
2
3
4
5
6
7
8
9
10
11
9

Lắng nghe sự kiện
1
2
3
4
5
6
7
8
9
10
11
4

Nếu bạn sử dụng bất kỳ mối quan hệ nào khác, bạn phải lắng nghe sự kiện

1
2
3
4
5
6
7
8
9
10
11
4 và kích hoạt việc lập chỉ mục

class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}
0
class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}
1

Máy biến áp

Một số phương thức xây dựng như

public function toSearchableArray[]
{
    $array = $this->toArray[];

    $array = $this->transform[$array];

    $array['author_name'] = $this->author->name;
    $array['author_email'] = $this->author->email;

    return $array;
}
2 và
public function toSearchableArray[]
{
    $array = $this->toArray[];

    $array = $this->transform[$array];

    $array['author_name'] = $this->author->name;
    $array['author_email'] = $this->author->email;

    return $array;
}
3 yêu cầu các giá trị số. Vì lý do này, nếu
class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}
8 không được xác định, theo mặc định, Scout Extended sẽ biến đổi

  • Ngày thành
    public function toSearchableArray[]
    {
        $array = $this->toArray[];
    
        $array = $this->transform[$array];
    
        $array['author_name'] = $this->author->name;
        $array['author_email'] = $this->author->email;
    
        return $array;
    }
    
    5
  • Chuỗi số thành
    public function toSearchableArray[]
    {
        $array = $this->toArray[];
    
        $array = $this->transform[$array];
    
        $array['author_name'] = $this->author->name;
        $array['author_email'] = $this->author->email;
    
        return $array;
    }
    
    6 hoặc
    public function toSearchableArray[]
    {
        $array = $this->toArray[];
    
        $array = $this->transform[$array];
    
        $array['author_name'] = $this->author->name;
        $array['author_email'] = $this->author->email;
    
        return $array;
    }
    
    7

Như thường lệ, bạn có thể ghi đè hành vi này bằng cách triển khai phương thức

class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}
8

1
2
3
4
5
6
7
8
9
10
11
class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}
3

Viết máy biến áp tùy chỉnh

Một trong những lợi ích chính của việc tạo lớp

public function toSearchableArray[]
{
    $array = $this->toArray[];

    $array = $this->transform[$array];

    $array['author_name'] = $this->author->name;
    $array['author_email'] = $this->author->email;

    return $array;
}
9 là khả năng gõ gợi ý bất kỳ phụ thuộc nào mà máy biến áp của bạn có thể cần trong hàm tạo của nó. Các phụ thuộc đã khai báo sẽ tự động được giải quyết và đưa vào phiên bản máy biến áp

Để viết một máy biến áp, bạn cần tạo một lớp mới triển khai

1
2
3
4
5
6
7
8
9
10
11
12
13
14
0. Phương thức
class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}
9 sẽ biến đổi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2 đã cho khi cần

class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}
4
class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}
5

Cuối cùng, áp dụng một biến đổi tùy chỉnh gửi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
3 vào phương thức
class Article extends Model
{
    use Searchable;

    /**
     * Get the indexable data array for the model.
     *
     * @return array
     */
    public function toSearchableArray[]
    {
        $array = $this->toArray[];

        // Applies Scout Extended default transformations:
        $array = $this->transform[$array];

        // Add an extra attribute:
        $array['added_month'] = substr[$array['created_at'], 0, 7];

        return $array;
    }
}
9 và chỉ định các máy biến áp để áp dụng

Chủ Đề